| 
  • If you are citizen of an European Union member nation, you may not use this service unless you are at least 16 years old.

  • You already know Dokkio is an AI-powered assistant to organize & manage your digital files & messages. Very soon, Dokkio will support Outlook as well as One Drive. Check it out today!

View
 

awk

Page history last edited by PBworks 16 years, 3 months ago


Introdução

O awk funciona assim: awk ' padrão {ação} '.

 

fonte: http://www.onlinux.com.br/dicas/lnag/Linux_learning.htm

 

Exemplos

Para mostra as linhas que contenham o string "1024", eu posso usar:

 

cat nomedoarquivo | awk '/1024/ {print}'

 

O próximo exemplo extrai os campos 3 e 2 das linhas que contem "1024" e os mostra com os títulos "Nome" and "ID"

 

cat nomedoarquivo | awk '/1024/ {print "Nome: " $3 "ID: " $2}' > novoarquivo

 

O terceiro exemplo procura e mostra linhas com o terceiro campo igual a "peter" ou que contenham o string "marie":

 

cat nomedoarquivo | awk '$3 == "peter" || $3 ~ /marie/ '

 

Para entender o ultimo comando, eis aqui uma lista dos testes lógicos em awk: == igual, != diferente, < menor que, > maior que , <= menor ou igual a, >= maior ou igual a, ~ procurar por uma expressão regular, !~ que sejam diferente de uma expressão regular, || OU lógico, && E lógico, ! negação lógica.

 

 

 

 

Variáveis do awk

NR Contém o número do registro atual
NF contém o número de registros por campo
FS indica o separador de campos
RS indica o separador de registros
OFS indica o separador de campo do arquivo de saida
ORS indica o separador de registros do arquivo de saida

 

Dica sobre o delimitador de campos padrão "espaço"

caso queira imprimir repetindo o delimitador uso vírgula

 

echo "um dois tres quatro" | awk '{print $1,$2$3,$4}'
resultado --> um doistres quatro

 

indicando o separador de saída

 

awk -F: '{OFS="-"}{print $1,$6}' /etc/passwd

 

Adicionando um usuário aos mesmos grupos de outro sergio

No caso estou adicionando rafael aos mesmos grupos do usuário sergio

 

Obs1: por se tratar de um arquivo importante "/etc/group" primeiro faça backup

cp /etc/group /etc/group.backup

echo "$(awk -F":" 'OFS=":" {if ($4 ~ /sergio/) $4=$4",rafael"} {print}' /etc/group)" > /etc/group

Obs2: veja que há aspas englobando o comando pois o bash retiraria os
espaços gerando um arquivo inconsistente

Obs3: Tentei um novo modelo de comando que testa se o usuário já está nos grupos requeridos,
mas obtive erro ao colocar em uma variável, ainda não descobri o motivo.

awk -F":" 'OFS=":" {if ($4 ~ /sergio/ && $4 !~ /rafael/) $4=$4",rafael"} {print}' /etc/group

 

 

Imprimir o nome dos grupos que tiverem como membro o usuário sergio

 

awk -F":" '$4 ~ /sergio/ {print $1}' /etc/group

 

Obs: por padrão o separador de campos é o espaço

 

awk '{if ($3 < 1980) print $3, "    ",$5,$6,$7,$8}' coins.txt

 

Imprimir uma linha específica

 

awk 'NR==1234' arquivo

 

Programa que imprime o tamanho da maior linha.

 

awk '{ if (length($0) > max) max=length($0) }  END { print max }' texto.txt

 

Imprimir o nome dos usuários acima de um determinado GID

 

awk -F":" '{if ($4 >= 1000) print $1}' /etc/passwd

 

Imprimir linhas maiores que 80 caracteres

 

length($0) > 80

 

Pegando o endereço IP

 

ifconfig eth0 | awk '/inet end/ {print $3}'

 

Imprimir cada registro (linha) numerada "NR" usando Número do Registro

awk -F":" '{ print NR " " $0 }' /etc/passwd

 

Trocar de posição os campos 1 e 2 de um arquivo e imprimir a linha

 

{ temp = $1 ; $1 = $2 ; $2 = temp ; print }

Um outro jeito mais inteligente!

'{print $2,$1}'

 

Tratando o arquivo abaixo

 

Augusto Cesar Campos;3001;6

Ronaldo Hornburg;3001;2

Flavio Luis Costa;3002;3

Gabriela Silva;3002;8

Arnaldo Cesar Coelho;3003;15

 

Nome do aluno; turma; faltas

 

awk -F";" '$3 > 12 {print $1 $2 $3}' chamada.txt

 

Para ler apenas 30a. linha:

$ awk 'NR == 30' arquivo.txt

 

Localizando processos por usuário

 

ps aux | awk '!/root|nobody/ { if ($4>2) {print $2,$11}}'

 

contar o número de linhas em um arquivo

 

awk 'END { print NR }' <arquivo>

 

Imprimindo a lista de usuários do Sistema

 

awk -F":" '{ print $1 }' /etc/passwd

lista de usuários e o GID
awk -F":" '{ print $1 " " $3 }' /etc/passwd

awk -F":" '{ print "username: " $1 "ttuid:" $3 }' /etc/passwd

=======================
for user in $(awk -F: '{print $1}' /etc/passwd);{

echo $user
sleep 1
}


!Imprimindo as linhas não vazias
<verbatim>
awk '{ if (NF > 0) print }'

 

Modificando o separador de registros e de campos

 

Se você tem o arquivo...

1
2
3
4
5
teste
6
7
8
9
10
teste
11
12
13
14
15
teste
16
17
18
19
20
teste

... e quer definir como delimitador de registros a palavra "teste"

awk 'BEGIN { FS="n"; RS="teste"} {if (NR=="2") print }' teste.txt

 

Pegar coluna de linha especifica, exemplo da coluna 2 na linha 5

 

awk 'NR == 5 {print $2}'

 

Exemplos

 

awk '/sergio/ {print}' /etc/passwd  (imprime a linha que contém sergio)
awk -F":" '$1 == "sergio" { print $3}' /etc/passwd

Veja um exmeplo que irá imprimir somente o terceiro campo da linha se o quinto campo da mesma linha contém a seqüência de caracteres root:

$5 ~ /root/ { print $3 }

O awk também oferece uma declaração if legal, parecida com a do C. Se você quisesse, poderia reescrever o script anterior usando uma declaração if:

{
if ( $5 ~ /root/ ) {
print $3
}
}

Usando declarações if, podemos transformar este código:

! /matchme/ { print $1 $2 $3 }

neste:

{
if ( $0 ! ~ /matchme/ ) {
print $1 $2 $3
}
}

 

Combinando o awk com o vim

Inserir a letra 'a' nas linhas 7,8,9,10,11,...,84:

 

 

:7,84 ! awk '< print "a" $0 >'

 

Casos de uso

 

Pessoal....

Tenho a seguinte string:

local1 1111 disco01 off local2 2222 disco02 off local3 3333
disco03 off local4 4444 disco04 off

preciso trocar as palavras...de posição.... gostaria..de ter a saida assim:

1111 local1 disco01 off 2222 local2 disco02 off 3333 local3 disco03 off

no caso acima trocar somente ... 1111 pelo local1 e o 2222 pelo
local2....e assim por diante...3333 pelo local3
como posso fazer isto...?

estou dando uma melhorada no meu dialog, depois de pronto coloco o
código completo.

Eduardo

Solução

 awk 'BEGIN{RS="off"} {print $2,$1,$3,RS}' arquivo

 

 

Veja também

 

Comments (0)

You don't have permission to comment on this page.