完全忽略以特定模式开头的行

完全忽略以特定模式开头的行

我有一个脚本可以分析计算软件的输出。有时输出带有一些与我的脚本无关的额外数据。这些数据可能很大,使得运行我的简单脚本变得非常慢。

我的脚本在 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

相关内容