awk

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