Codigos Fonte, Artigos e Dicas
Usando o AWK. O que é? E para quer serve?
“O nome awk não tem tradução, e consiste nas iniciais dos seus três autores, um dos quais é também co-autor de outra inguagem famosa: o C. O awk está disponível desde 1977, mas as versões disponíveis atualmente são mais recentes, datando da segunda metade da década de 80“
Trecho Retirado do Br-linux
Na verdade na maioria das distribuições hoje em dia você vai encontrar o gawk, um projeto GNU de implementação do verdadeiro AWK.
Muitos utilizam o awk como uma linguagem de programação, porém eu utilizo apenas para aproveita uma unica funcionalidade (por enquanto), editar arquivos manipulando campos separado logicamente por tabulação (ou utilizando um separador). É demasiadamente util e simples.
Vamos a exemplos:
Supondo que tenhamos o seguinte arquivo (file1.txt)
bloco1 bloco2 bloco3 bloco1 bloco2 bloco3 bloco1 bloco2 bloco3 bloco1 bloco2 bloco3 bloco1 bloco2 bloco3
Vamos usar o seguinte comando no arquivo file1.txt:
cat file1.txt | awk '{print $1}'
Iremos ter a seguinte saída:
bloco1 bloco1 bloco1 bloco1 bloco1
No comando anterior utilizamos o comando “cat” para mostrar a saída do arquivo “file1.txt” utilizamos o pipe | (barra em pé) para canalizar a saída do arquivo “file1.txt” para a entrada do comando do “awk“.
Comando “awk“, utilizamos o comando ‘print‘ junto com a variável ‘$1‘, nesse exemplos dizemos para imprimir a primeira coluna de cada linha do arquivo.
Se nós tivéssemos colocado a variável ‘$0‘ ele imprimiria toda a linha e o arquivo todo seria impresso.
Nota: ao invés de utilizar o pipe para canalizar a saída do comando cat, você poderia simplesmente executar: awk ‘{print $1}’ file1.txt
Agora nós queremos imprimir a primeira e a terceira coluna:
awk '{print $1 $3}' file1.txt
Output:
bloco1 & bloco3 bloco1 & bloco3 bloco1 & bloco3 bloco1 & bloco3 bloco1 & bloco3
Agora podemos salvar a saída do awk em um arquivo (nesse caso saida.txt):
awk '{print $1 " & " $3}' file1.txt > saida.txt
Agora qual seria a utilidade disso? para muitas coisas…
minha principal finalidade em relembrar isso foi porque eu tinha um arquivo de texto com linhas indicando o caminho de outros arquivos e precisava deletar todos esses arquivos (linha por linha):
./outlet2/classes/outlet/.svn ./outlet2/classes/outlet/.svn/tmp/text-base/OutletMapper.php.svn-base ./outlet2/classes/outlet/.svn/tmp/text-base/OutletProxy.php.svn-base ./outlet2/classes/outlet/.svn/tmp/text-base/outletgen.php.svn-base ./outlet2/classes/outlet/.svn/tmp/text-base/OutletConfig.php.svn-base ./outlet2/classes/outlet/.svn/tmp/text-base/OutletQuery.php.svn-base ./outlet2/classes/outlet/.svn/tmp/text-base/OutletProxyGenerator.php.svn-base ./outlet2/classes/outlet/.svn/tmp/text-base/OutletConnection.php.svn-base ./outlet2/classes/outlet/.svn/tmp/text-base/Outlet.php.svn-base ./outlet2/classes/outlet/.svn/tmp/text-base/Collection.php.svn-base ./outlet2/classes/outlet/.svn/tmp/text-base/OutletCollection.php.svn-base ./outlet2/classes/.svn ./outlet2/docs/.svn ./outlet2/docs/.svn/tmp/text-base/outlet.docbook.svn-base ./outlet2/docs/.svn/tmp/text-base/config.xsl.svn-base ./outlet2/samples/tasks/docroot/.svn ./outlet2/samples/tasks/docroot/.svn/tmp/text-base/outlet-config.php.svn-base ./outlet2/samples/tasks/docroot/.svn/tmp/text-base/config.php.svn-base ./outlet2/samples/tasks/docroot/.svn/tmp/text-base/outlet-config.xml.svn-base ./outlet2/samples/tasks/docroot/.svn/tmp/text-base/index.php.svn-base ./outlet2/samples/tasks/docroot/.svn/tmp/text-base/test.sq3.svn-base ./outlet2/samples/tasks/classes/.svn ./outlet2/samples/tasks/classes/.svn/tmp/text-base/User.php.svn-base ./outlet2/samples/tasks/.svn ./outlet2/samples/.svn ./outlet2/.svn ./outlet2/.svn/tmp/text-base/LICENSE.svn-base ./outlet2/.svn/tmp/text-base/INSTALL.svn-base ./outlet2/.svn/tmp/text-base/RELEASE.svn-base ./outlet2/unit-tests/simpletest/docs/en/.svn ......................................... e muito mais........................
E eu não ia dar um delete em cada arquivo! a solução?
cat caminhos.txt | awk '{print "rm -drv " $1}' > svn-delete.sh
Pronto! agora foi só ter o trabalho de executar 1 comando (executar o shell script =)
./svn-delete.sh
P.S.: Para procurar arquivos no shell do linux utilizei o comando “find“, para obter o resultado de todos os arquivos e pastas que continham “.svn” no nome:
find . -iname *.svn* > svn-delete-NEW.sh;
- “find” -> comando para procurar
- “.” -> caminho aonde ele deve procurar os arquivos o . (ponto solitário) quer dizer para procurar no diretório que estou.
- “-iname *.svn*” -> procurar por todos os arquivos que tenham “.svn” no meio
- “> svn-delete.sh” -> joga a saída do comando para o arquivo “svn-delete“
Imagine se eu só utilizasse o explorer.exe =D
Abraços.
Posts Relacionados
| Imprimir artigo | Este artigo foi escrito por Alexandre Santos em 4 04UTC novembro 04UTC 2009 às 21:03, e está arquivado em Linux. Siga quaisquer respostas a este artigo através do RSS 2.0. Você pode deixar uma resposta ou fazer um trackback do seu próprio site. |


há 4 meses atrás
bom dia!!! achei muito bom seu post….
e achei bem explicativo….
Como eu tenho muita dificuldade de entender os comandos, gostaria de possivel, colocar para que serve cada tag que pode ser usada no awk, ex:
$ – significado
for – significado
‘ – significado
; – significado
etc…
e quando cada um pode ser usado….
por que nunca sei o q vem primeiro, se e o local, se e o comando, quano usar “” por ex….
eu tenho muuuita dificuldade de entender e meu novo emprego depende disso tb….
obrigado
[Reply]