ignora completamente as linhas que começam com um padrão específico

3

Eu tenho um script que analisa a saída de um software de computação. às vezes a saída vem com alguns dados extras que são irrelevantes para o meu script. Esses dados podem ser enormes e fazer com que meu script simples fique muito lento.

Meu script está em awk / bash.

Eu queria saber se é possível dizer ao awk para ignorar completamente as linhas depois de um padrão específico.

por exemplo:

GOOD STUFF
----------------
IRRELEVENT DATA
----------------
IGNORE ALL THESE
----------------
END OF IT
----------------
GOOD STUFF

Eu também estava me perguntando se eu dissesse ao awk para procurar por linhas que começassem com um padrão específico, ignoraria o que vem depois e aceleraria o script?

    
por Raymond Ghaffarian Shirazi 31.05.2016 / 18:55

2 respostas

3

Para ignorar algumas linhas linha a linha, adicione /unwanted pattern/ {next} ou ! /wanted pattern/ {next} no início do script.

Como alternativa, filtre com grep: grep -v 'unwanted pattern' | awk … ou grep 'wanted pattern' | awk … . Isto pode ser mais rápido se grep elimina muitas linhas, porque grep é tipicamente mais rápido que awk para a mesma tarefa (grep é mais especializado para ser otimizado para sua tarefa; awk é uma linguagem de programação completa, pode fazer muito mais mas é menos eficiente).

Se você quiser ignorar um bloco de linhas consecutivas, o awk tem um recurso conveniente para isso: adicione /^IRRELEVENT DATA/../^END/ {next} na parte superior do script para ignorar todas as linhas que começam com IRRELEVENT DATA ( sic ) e as seguintes linhas até a primeira linha que começa com END . Você não pode fazer isso com grep; você pode fazê-lo com o sed ( sed '/^IRRELEVENT DATA/,/^END/' | awk … ), mas é menos provável que seja um ganho de desempenho do que o grep.

    
por 01.06.2016 / 01:41
1

Sem usar o próximo, usando negação em vez disso.

entrada:

$ cat f.txt 
GOOD STUFF
----------------
IRRELEVENT DATA
----------------
IGNORE ALL THESE
----------------
END OF IT
----------------
GOOD STUFF

Eu quero ignorar as linhas que começam com string IRRELEVENT ou IGNORE ou END:

$ awk   '!/IRRELEVENT|IGNORE|END/{print }' <(cat f.txt)
GOOD STUFF
----------------
----------------
----------------
----------------
GOOD STUFF
    
por 27.08.2018 / 17:23

Tags