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

Ray*_*azi 12 awk string

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

我的脚本在 awk/bash 中。

我想知道是否有可能告诉 awk 完全忽略特定模式后的行。

例如:

GOOD STUFF
----------------
IRRELEVENT DATA
----------------
IGNORE ALL THESE
----------------
END OF IT
----------------
GOOD STUFF
Run Code Online (Sandbox Code Playgroud)

我还想知道是否告诉 awk 查找以特定模式开头的行,它会忽略后面的任何内容并加速脚本吗?

Gil*_*il' 10

要逐行忽略某些行,请在脚本的开头添加/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( sic )开头的所有行和以下行,直到以 开头的第一行END。你不能用 grep 做到这一点;您可以使用 sed ( sed '/^IRRELEVENT DATA/,/^END/d' | awk …)来实现,但与grep 相比,性能提升的可能性较小。

  • awk 范围语法是(也是)逗号,而不是两个点,对于 sed,您需要命令“d”。此处不相关,但一般来说 awk 可以在同一(单)行上匹配 start,end 而 sed 不能。 (3认同)

z a*_*tef 6

不使用 next,而是使用否定。

输入:

$ cat f.txt
GOOD STUFF
----------------
IRRELEVENT DATA
----------------
IGNORE ALL THESE
----------------
END OF IT
----------------
GOOD STUFF
Run Code Online (Sandbox Code Playgroud)

我想忽略以字符串“IRRELEVENT”或“IGNORE”或“END”开头的行:

$ awk '!/^(IRRELEVENT|IGNORE|END)/' f.txt
GOOD STUFF
----------------
----------------
----------------
----------------
GOOD STUFF
Run Code Online (Sandbox Code Playgroud)