A linguagem awk é muito conhecida por sua eficácia em criar filtros de conteúdos de arquivos. Nessa dica vou ensinar alguns truques que facilitarão a vida de todos.
Vamos tomar como base o arquivo leo.txt, que tem o seguinte conteúdo:
1. Preciso mostrar na tela a primeira coluna do arquivo:
cat leo.txt | awk '{print $1}'
188
267
438
Entendendo:
print $1 -> Exibe a primeira coluna;
print $2 -> Exibe a segunda coluna e assim por diante;
print $NF ->Exibe a última coluna.
2. Em seguida me foi solicitado que contasse as linhas do resultado acima, para isso podemos utilizar outro comando após o resultado:
cat leo.txt | '{print $1}' | wc -l
3. Suponha que eu necessite vasculhar esse arquivo e mostrar apenas os campo com dia e mês, repare que na frente do dia existe um ":" que nos atrapalharia um pouco nessa busca. Vou usar o comando cat para mostrar que o awk pode ser combinado com os comandos do shell:
cat leo.txt | awk -F ":" '{print substr($2,1,4)}'
2106
2206
2306
Entendendo:
awk -F ":" -> Ignora o caractere ":" da segunda coluna;
{print substr($2,1,4)}' -> Exibe a segunda coluna do primeiro ao quarto caractere.
4. Agora eu gostaria que, após mostrar esse resultado, ele fizesse um filtro por uma data específica, vou tomar como seleção "2106":
6. Me foi solicitado que fizesse um filtro para descobrir todos os campos de 18:32:02 até 18:32:08. Observe que aqui estaremos trabalhando com um intervalo. Então ficaria da seguinte forma:
[5] Comentário enviado por cordobel em 24/07/2012 - 09:54h
Bom dia pessoal. É muito bom mesmo o awk. E aproveitando que este post me ajudou no trabalho agora mesmo no momento em que escrevo este comentário, vou resumir a situação para poder dar um esclarecimento a mais sobre o funcionamento do awk.
Veja o seguinte trexo da saída do comando dir do windows:
Eu precisava fazer um diff de dois diretórios, (origem e backup) por isso salvei a saída do dir de cada um.
Mas como as datas em item de cada diretório também são diferentes, o diff iria acusar que todas as linhas são diferentes, o que não ia me ajudar em nada.
Logo eu deveria dar um jeito de salvar apenas o conteúdo da última coluna.
A princípio eu achava que o awk considerava as colunas assim como são consideradas as colunas por meio de um editor de texto, ou seja, cada caractere da linha é uma coluna.
E se observer o exemplo que dei, cada linha tem muitos caracteres em branco, que são considerados uma coluna cada um, no caso de um editor de texto.
Mas ao testar o awk notei que ele considera coluna, um conjunto de caracteres não brancos ou palavra, logo o comando:
cat saida_dir_c_server.txt | awk '{print $5}'
já resolveu o meu problema, imprimindo na tela a penas o último conjunto de caracteres ou última palavra de cada linha, da seguinte maneira:
[6] Comentário enviado por cordobel em 24/07/2012 - 09:59h
Poxa vida, que pena. Ao salvar o comentário o site desconsiderou o excesso de caracteres em branco que aparecem na saída do comando dir do windows. Mas para que tenham uma noção o maior excesso fica entre a coluna do <DIR> e do server_1**
[7] Comentário enviado por ram0nes em 27/08/2014 - 14:46h
parabéns Leonardo vlw gostei gostaria tbm de um exemplo.
supor que eu tenha uma lista contendo diversos ips assim 200.0.11.87(201-0-11-87.dsl.telesp.net.br):21 :220 TelNet Server (Debian) [::ffff:201.0.11.87] como eu faria para deixar somente o ip ?
200.0.11.87
[10] Comentário enviado por antonioamazonas em 10/06/2015 - 01:25h
Olá Leonardo, olá a todos.
Sou Novo no multiverso LINUX e novo também no forum, comecei a usar o Ubuntu modo texto.
estou com alguns exercícios da faculdade que utiliza o "awk"
Ex:
tenho uma lista que se chama "nomes.dat" (a extensão é somente um parâmetro organizacional) com nomes e Ids de usuários ex:
Tenho outro arquivo chamado "telefones.dat" com as seguintes informações:
1000 100 1111-0000
1001 100 1111-1111
1002 100 2222-2222
1003 101 3333-3333
E assim sucessivamente...
O que o professor pede é que seja feito um codigo que receba como parametro um nome e imprima as linhas do arquivo nomes.dat que o contenham
2 outro que faça a mesma coisa mas que só imprima os nomes
3 Que receba como primeiro parametro um numero da primeira coluna e imprima as linhas do arquivo telefones,dat que a segunda coluna contenham esse código
e tem outras variações mas que se eu conseguir fazer um ou dois, creio que consiga desenvolver os outros.
estudando o comando "awk" percebi que se eu digitasse :
awk -F " "'/jorge/ {print $2,$3;}' nomes.dat
Ele me retornava o nome "jorge amado" do arquivo nomes.dat
comecei a fazer o código assim:
#!/bin/sh
read -p " Digite o nome do contato e pressione <ENTER> " CONTATO
echo " Buscando dados de $CONTATO, por favor aguarde..."
slep 2
clear
desejo aber com faço para que o comando awk leia o conteúdo armazenado na variável CONTATO e busque no arquivo nomes.dat e me retorne a linha correspondente ao nome e sobrenome do contato?
Desculpem caso tenha postado em uma área indevida.
Agradeço a todos!
isso e um arquivo gerado pelo ns2 preciso filtrar , tirar os números ante do ponto por exemplo 28.277940 caso teria de ficar assim 277940 so esse resultado tem que ficar, ja procurei varios comandos ainda não encontrei, teho que tirar todos de uma so vez!