Ainda há alguma razão para aprender AWK?

109

Estou constantemente aprendendo novas ferramentas, mesmo as antiquadas, porque gosto de usar a solução certa para o problema.

Mesmo assim, me pergunto se ainda há razão para aprender alguns deles. awkpor exemplo, é interessante para mim, mas para o processamento de texto simples, eu posso usar grep, cut, sed, etc. enquanto que para os complexos, eu vou para Python.

Bem, não quero dizer que não seja uma ferramenta poderosa e útil. Mas, uma vez que é preciso tempo e energia para aprender uma nova ferramenta, vale a pena ?

e-satis
fonte
2
é 2019 e acabei de reescrever um normalizador de log do Python no awk. Eu executei a transformação em uma semana de arquivos de log que eram 54 milhões de arquivos de log de linha (~ 9 GB). No meu Macbook Pro (2,8 GHZ i7, 16 GB de Ram), a versão python pode processar ~ 10k linhas por segundo => 90 minutos de tempo de execução. Usando mawk, o tempo de execução foi reduzido para 2 minutos. Aliás, o programa awk tinha metade do tamanho.
mistahenry de
@mistahenry você tentou pypy?
qwr

Respostas:

97

Acho que depende do ambiente em que você se encontra. Se você é uma pessoa * nix, saber awké uma coisa boa. O único outro ambiente de script que pode ser encontrado em praticamente todos os * nix é sh. Enquanto grep, sed,etc podem certamente substituir awkem uma linuxdistro mainstream moderna , quando você muda para sistemas mais exóticos, saber um pouco awkvai ser muito útil.

awktambém pode ser usado para mais do que apenas processamento de texto. Por exemplo, um de meus supervisores escreve código de astronomia em awk- ele é totalmente antiquado e incrível . Naquela época, era a melhor ferramenta para o trabalho ... e agora, embora seus alunos como eu usem python e outras coisas, ele se atém ao que sabe e funciona bem.

Para encerrar, há muito código antigo circulando pelo mundo, saber um pouco awknão vai doer. Também o tornará melhor * pessoa nix :-)

espaço livre
fonte
12
++ Concordo, awk realmente é uma das ferramentas mais portáteis e, mais importante, consistentes no conjunto de ferramentas * nix. Ele funciona de forma confiável no busybox, por exemplo, onde perl não está em lugar nenhum.
armas
1
E também não é tão difícil de aprender se você está acostumado com linguagens de chaves
armas
2
"É o mesmo em qualquer ambiente" - não exatamente: no Windows, as aspas simples devem ser substituídas por duplos, se os duplos internos devem ser escapados. (O Windows é meio que um ambiente real, mesmo que se expor à atrocimidade insegura e incompleta de Redmond o coloque à mercê de qualquer russo de 15 anos).
GT.
6
Não creio que muitas pessoas associem a existência de awk e windows no mesmo universo .....: P
FoldedChromatin 02/10/2015
2
Ainda usando o awk para trabalhos de processamento de texto. Freqüentemente, inicio um script em outra coisa (ruby, python) e acabo voltando ao awk pela simplicidade e poder.
Rumbleweed de
103

Se você aprender rapidamente o básico do awk, poderá realmente fazer coisas incríveis na linha de comando.

Mas a verdadeira razão para aprender awk é ter uma desculpa para ler o excelente livro The AWK Programming Language de seus autores Aho, Kernighan e Weinberger. Você pensaria, a partir do nome, que ele simplesmente ensina a despertar. Na verdade, isso é apenas o começo. Lançando-se na vasta gama de problemas que podem ser resolvidos quando se usa uma linguagem de script concisa que torna a manipulação de strings fácil - e awk foi um dos primeiros - ele ensina o leitor a implementar um banco de dados, um analisador, um intérprete , e (se a memória não me falha) um compilador para uma pequena linguagem de computador específica para um projeto! Se eles também tivessem programado um sistema operacional de exemplo usando awk, o livro teria sido uma introdução de pesquisa bastante completa para a ciência da computação!

Notavelmente claro e conciso, como o livro original da linguagem C, também é um exemplo maravilhoso de redação técnica amigável feita da maneira certa. Até o índice é uma obra de arte.

Awk? Se você souber disso, irá usá-lo na linha de comando ocasionalmente, mas para qualquer coisa maior você se sentirá preso, incapaz de acessar os recursos mais amplos de seu sistema e da Internet aos quais algo como o Python fornece acesso. Mas o livro? Você sempre ficará feliz em lê-lo!

Brandon Rhodes
fonte
5
+1 vendido. Vou encomendar este livro. Há anos uso o awk como uma linguagem de script de uma linha rápida e poderosa. Awk é um ótimo pré-processador para arquivos que, de outra forma, levariam uma dúzia de linhas para codificar. Não consigo contar quantas vezes usei o formulário: awk '{print $ 1, $ 2}'
galaxywatcher
2
Acordado. É quase impossível acreditar o quão compacto esse livro é dado tudo o que ele contém. Ele cobre mais do que a maioria dos livros contemporâneos em 1/10 (?) Do comprimento.
argila
3
Estou lendo este livro agora e ele inflamou meu entusiasmo por awk a uma quase obsessão.
galaxywatcher
3
Veja também o excelente Gawk: Effective AWK Programming .
lhf
1
Acabei de ler o primeiro capítulo. É maravilhoso. Mistério resolvido.
vaichidrewar de
29

A única razão pela qual uso awké a divisão automática:

awk '{print $3}' < file.in

Isso imprime o terceiro campo delimitado por espaços em branco em file.in. É um pouco mais fácil do que:

tr -s ' ' < file.in | cut -d' ' -f3
Greg Hewgill
fonte
3
por que usar em awk '{print $3}' < file.invez de awk '{print $3}' file.in? O awk já não lê arquivos quando passados ​​como argumentos?
mbigras
@mbigras Claro, você pode usar o awk de qualquer maneira.
Greg Hewgill
Mesmo com tamanho duplo, gosto da solução não awk. E não sei porque odeio awk: /
MD. Mohiuddin Ahmed
25

Eu acho que o awk é ótimo se o seu arquivo contém colunas / campos . Eu o uso ao processar / analisar uma coluna específica em um arquivo com várias colunas. Ou se eu quiser adicionar / excluir uma (s) coluna (s) específica (s).

por exemplo

awk -F \t '{ if ($2 > $3) print; }' <filename>

será impresso apenas se o valor da 2ª coluna em um arquivo separado por tabulação for maior que o valor da 3ª coluna.

Claro que eu poderia usar Perl ou Python, mas awk torna muito mais simples com um comando de linha única conciso.

Além disso, aprender awk tem um custo muito baixo. Você pode aprender o básico do awk em menos de uma hora, então não é tanto esforço quanto aprender qualquer outra linguagem de programação / script.

Nikhil
fonte
Embora eu realmente não use muito o awk, esse é um ótimo uso para o awk.
Paul Nathan
8

Eu uso AWK ocasionalmente para lidar com HTML. Por exemplo, este código converte tabelas em arquivos csv:

BEGIN {s=""; FS="n"}
/<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);}
/<tr|<TR/ { print s; s="" }

O que é ótimo se você estiver raspando a tela. Na verdade, pode ser o caso de eu adorar AWK porque me permite construir a solução errada para problemas tão rapidamente :) mais exemplos . Também é mencionado nas adoráveis Pérolas de Programação de Jon Bentley .

Dave
fonte
7

Eu uso o awk de vez em quando. É bom para embaralhamento de texto muito simples no meio de um pipeline; ele preenche um nicho muito estreito entre não precisar dele e precisar sacar Perl / Python / qualquer.

Eu não aconselharia você a gastar muito tempo com isso, mas pode ser útil saber o básico da sintaxe - pelo menos o suficiente para que você possa consultar o manual rapidamente, caso queira usá-lo.

Eevee
fonte
5

A maioria dos liners awk one pode ser alcançada com liners Perl one - se você escolher entrar em uma mentalidade Perl one liner. Ou use apenas três liners Perl :)

Se você está mantendo scripts de shell escritos por alguém que gostou do awk, então, claramente, você precisará aprender o awk.

Mesmo que não haja necessidade prática, se você já conhece regex, não demorará muito para aprender o básico, e é divertido ver como as coisas eram projetadas naquela época. É bastante elegante.

fino
fonte
5

6 anos depois de fazer esta pergunta agora posso responder com certeza: não, aprender awk não vale a pena.

As tarefas básicas são fáceis de manusear, mas os comandos bash básicos ou mesmo as ferramentas GUI. Tarefas mais complexas serão facilmente resolvidas com linguagens dinâmicas modernas como Python (fav ou mine) ou Ruby.

Definitivamente, você deve aprender uma linguagem dinâmica de script moderna, pois ela o ajudará em muitas tarefas (web, administração, processamento de dados, automação, etc). E, ao fazer isso, aprender ferramentas como o awk é completamente inútil, e você economizará, na melhor das hipóteses, alguns segundos por mês.

e-satis
fonte
2
Não necessariamente verdade. Se você estiver analisando arquivos muito grandes, pode ser muito mais rápido do que outras ferramentas.
user1071847
Interessante porque alguns anos depois disso, você ainda está fazendo perguntas sobre o awk. Eu fui um dos respondentes originais e ainda o uso com certa regularidade até hoje
Dexygen
4

Se você já conhece e usa sed, é melhor aprender pelo menos um pouco de awk. Eles podem ser usados ​​juntos para alguns truques muito poderosos. Sempre impressiona o público.

Amigo da Internet
fonte
4

Computerworld recentemente deu uma entrevista com Alfred V. Aho (um dos três criadores do AWK) sobre AWK. É uma leitura bastante interessante. Então, talvez você encontre algumas dicas nele, porque é uma boa ideia aprender AWK.

dlat
fonte
Legal, mas não me convenceu. AWK é uma ferramenta muito boa, mas acho que nunca vou precisar dela o suficiente para dedicar um tempo para aprendê-la, em vez de hackear minha solução em sed ou python.
e-satis
4

Aprender AWK foi inestimável para mim em meu último contrato de trabalho em um sistema Linux embarcado no qual nem Perl nem a maioria das outras linguagens de script foram instaladas.

Dexygen
fonte
2
9 anos depois, usei muito o awk hoje enquanto realizava grep nos logs do git
Dexygen
3

awk tem uma relação utilidade / dificuldade muito boa, e "awk simples" funciona em qualquer Unix / Linux / MacOS (e pode ser instalado em outros sistemas também).

Ele foi projetado na Idade de Ouro, quando as pessoas odiavam digitar, então os scripts podem ser muito, muito curtos e rápidos de escrever. Vou tentar instalar o mawk, uma versão rápida, supostamente ele acelera o cálculo cerca de 9 vezes, o awk / gawk é bem lento, então se você quiser usá-lo ao invés do R etc., você pode querer o mawk.

BongBong Chu
fonte
2

É útil principalmente se você tiver que ocasionalmente analisar arquivos de log para dados ou saída de programas durante a execução de scripts de shell, porque é muito fácil conseguir no awk que isso exigiria um pouco mais de linhas de código em python.

Certamente tem mais poder do que isso, mas parece que são as tarefas para as quais a maioria das pessoas o usa.

NeuroSys
fonte
2

Claro: estou trabalhando em um ambiente onde as únicas linguagens disponíveis são: (alguma linguagem shity que gera COBOL, OMG, OMG), bash (versão antiga), perl (ainda não domino), sed, awk e alguns outros utilitários de linha de comando. Saber awkme economizou várias horas (e gerou várias tarefas de processamento de texto de meus colegas - eles vêm até mim pelo menos três vezes por dia).

Zsolt Botykai
fonte
1

Eu diria que provavelmente não vale mais a pena. Eu o uso de vez em quando como um editor de stream muito mais versátil do que o sed, com habilidades de pesquisa incluídas, mas se você é proficiente em python, não conheço uma tarefa que você consiga terminar muito mais rápido para compensar o tempo necessário para aprender awk.

O comando a seguir é provavelmente o único para o qual usei o awk nos últimos dois anos (ele limpa pacotes parcialmente removidos de meus sistemas Debian / Ubuntu):

$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P
Matthias Kestenholz
fonte
1

Não.

Mesmo que seja interessante, você pode fazer tudo o que o awk pode fazer usando outras ferramentas mais poderosas como o Perl.

Gaste seu tempo aprendendo essas ferramentas mais poderosas - e apenas acidentalmente aprenda algumas coisas ao longo do caminho.

Ed Guiness
fonte
1

Eu diria que existe. Para coisas simples, AWK é muito mais fácil para o administrador de sistema / desenvolvedor inexperiente do que Python. Você pode aprender um pouco de AWK e fazer muitas coisas, aprender Python significa aprender uma linguagem totalmente nova (sim, eu sei que AWK é uma linguagem que faz sentido também).

Perl pode ser capaz de fazer muitas coisas que AWK pode fazer, mas ofereceu a opção nos dias de hoje eu escolheria Python aqui. Então, sim, você deve aprender AWK. mas aprenda Python também :-)

wzzrd
fonte
1

awké uma linguagem powertool, então você provavelmente awkserá usada em algum lugar se for um profissional de TI de qualquer tipo. Se você consegue lidar com a sintaxe e as expressões regulares de grepe, sedentão, não deve ter problemas para aprender awke provavelmente vale a pena.

Eu awkrealmente descobri que brilhar é na simplificação de coisas como processar registros de várias linhas e mutilar / interpolar vários arquivos simultaneamente.


fonte
0

Agora que o PERL foi portado para praticamente todas as plataformas significativas, eu diria que não vale a pena. É mais versátil do que sed e awk juntos. Quanto à divisão automática, você pode fazer isso em perl assim:

perl -F':' -ane 'print $F[3],"\n";' /etc/passwd

EDIT: você ainda pode querer se familiarizar um pouco com o awk, porque algumas outras ferramentas são baseadas em sua filosofia de ações baseadas em padrões (por exemplo, DTrace no Solaris).

zvrba
fonte
0

Eu trabalho na área em que os arquivos estão em formato de coluna. Assim, o awk é inestimável para mim REFORMATAR o arquivo para que diferentes softwares possam trabalhar juntos. Para profissionais que não são de TI, usar o awk é suficiente e perfeito. Hoje em dia, a velocidade do computador não é um problema, então posso combinar awk e unix para canalizar muitos comandos de liners em um "script". Com a pesquisa Awk por campo e registro, eu o uso para verificar os dados do arquivo muito rápido, em vez do "vi" para abrir um arquivo. Devo dizer que a capacidade do awk trouxe alegria ao meu trabalho, especialmente, eu sou capaz de ajudar o colega de trabalho a resolver as coisas rapidamente usando o awk. Código incrível para mim.

Hai Truong
fonte
0

Recentemente, tentei visualizar arquivos pcap de rede registrando um ataque DOS que atingiu mais de 20 Gbs. Eu precisava do carimbo de data / hora e dos endereços IP. No meu cenário, o AWK one-liner funcionou fabulosamente e muito rápido também. Eu usei o AWK especificamente para limpar os arquivos extraídos, obter os endereços IP e a contagem total de pacotes desses endereços IP em um intervalo de tempo agrupado. Eu concordo totalmente com o que outras pessoas escreveram acima. Isso depende de suas necessidades.

Ash Catchem
fonte
0

Uma razão para NÃO aprender o awk é que ele não tem correspondências não gananciosas em expressões regulares.

Eu tenho um código awk que agora devo reescrever apenas porque de repente depurei que não existem correspondências não gananciosas em awk / gawk, portanto, ele não pode executar corretamente alguns regexes.

user619271
fonte
0

Depende de seus companheiros de equipe e de seu líder e da tarefa em que está trabalhando.

if( team mates and leader ask to write awk ){
  if( you can reject that){
    if( awk code is very small){
      learn little just like learn Regex
    }else{
      use python or even java
    }
  }else{
    do as they ask
  }
}
Kenneth
fonte
0

Tenho feito alguns códigos em python no momento. Mas eu ainda não o conheço bem o suficiente para usar facilmente para transformações simples de um arquivo.

Com o awk, posso desenvolver rapidamente um pedaço de código de uma linha na linha de comando do Unix que faz algumas transformações bastante swish. Cada vez que eu uso o awk, o trecho de código que escrevo será descartável e não terá mais do que algumas linhas. Talvez uma instrução "if" e uma instrução "printf" aqui ou ali em uma linha.

Eu nunca escrevi um trecho de código com mais de 10 linhas com awk. Eu vi alguns desses scripts anos atrás.

Mas qualquer coisa que exigisse muitas linhas de código, eu recorreria ao python.

Eu amo o awk. É uma ferramenta muito poderosa em combinação com o sed.

user5901715
fonte