我有一个脚本来分析计算软件的输出。有时输出会附带一些与我的脚本无关的额外数据。这些数据可能很大,使运行我的简单脚本变得非常缓慢。
我的脚本在 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 相比,性能提升的可能性较小。
不使用 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)