コンピューティングソフトウェアの出力を分析するスクリプトがあります。時には、私のスクリプトとは無関係な追加データが出力に表示されることがあります。このデータはかなり大きく、単純なスクリプト実行が非常に遅くなる可能性があります。
私のスクリプトはawk / bashにあります。
awkに特定のパターンの後ろの行を完全に無視するように指示できるかどうか疑問に思います。
たとえば、
GOOD STUFF
----------------
IRRELEVENT DATA
----------------
IGNORE ALL THESE
----------------
END OF IT
----------------
GOOD STUFF
また、awkに特定のパターンで始まる行を探すように指示すると、それに続く内容を無視してスクリプトの速度を上げるかどうか疑問に思います。
答え1
特定の行を1行ずつ無視するには、スクリプトの先頭に/unwanted pattern/ {next}
またはを追加します。! /wanted pattern/ {next}
またはgrep:grep -v 'unwanted pattern' | awk …
またはを使用してフィルタリングしますgrep 'wanted pattern' | awk …
。 grepが多くの行を削除すると、より高速になります。通常、同じ操作に対してgrepがawkよりも速いためです(grepはより特殊化されており、その操作に最適化されています。awkは完全なプログラミング言語であり、より多くの作業を実行できますが、効率は低下します)。 。
連続した行ブロックを無視するには、awkに便利なツールがあります。/^IRRELEVENT DATA/,/^END/ {next}
スクリプトの先頭に追加してIRRELEVENT DATA
(で始まるすべての行を無視します。原文)と.で始まる最初の行まで、次の行を入力しますEND
。 grepではこれを行うことはできません。 sed(sed '/^IRRELEVENT DATA/,/^END/d' | awk …
)を使用して実行できますが、grepと比較してパフォーマンスが向上する可能性はありません。
答え2
nextを使用する代わりに否定を使用してください。
入力する:
$ cat f.txt
GOOD STUFF
----------------
IRRELEVENT DATA
----------------
IGNORE ALL THESE
----------------
END OF IT
----------------
GOOD STUFF
「IRRELEVENT」、「IGNORE」、または「END」文字列で始まる行を無視したいと思います。
$ awk '!/^(IRRELEVENT|IGNORE|END)/' f.txt
GOOD STUFF
----------------
----------------
----------------
----------------
GOOD STUFF