我有一个脚本可以分析计算软件的输出。有时输出带有一些与我的脚本无关的额外数据。这些数据可能很大,使得运行我的简单脚本变得非常慢。
我的脚本在 awk/bash 中。
我想知道是否可以告诉 awk 完全忽略特定模式之后的行。
例如:
GOOD STUFF
----------------
IRRELEVENT DATA
----------------
IGNORE ALL THESE
----------------
END OF IT
----------------
GOOD STUFF
我还想知道如果我告诉 awk 查找以特定模式开头的行,它会忽略后面的内容并加快脚本速度吗?
答案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