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.