我在一个目录中有多个文件。我想提取包含整数值大于 45 的所有文件中的每一行。
目前,我正在使用:
grep "IO resumed after" *
Run Code Online (Sandbox Code Playgroud)
它向我显示此字符串“IO 恢复之后”的所有文件我想再添加一个参数,该参数将 grep 所有行“IO 在 [数字 > 45] 秒后恢复”
最好为此使用awk:
awk 'match($0,"IO resumed after") { if (substr($0,RSTART+RLENGTH)+0 > 45) print }' file
Run Code Online (Sandbox Code Playgroud)
这将搜索字符串“IO resumed after”,如果找到该字符串,它将获取该字符串之后的所有内容并将其转换为数字:如果“IO resumed after”之后的子字符串以数字开头,则它将转换为当我们向它添加零时的那个数字。
这仅在该行如下所示时才有效:
xxxxIO resumed after_nnnnyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Run Code Online (Sandbox Code Playgroud)
其中x和y是随机字符,下划线是任何空格序列,n是一个数字。
您可以使用以下命令集对其进行测试:
$ seq 40 0.5 50 | awk '{print "foo IO resumed after",$0,"random stuff"}' \
| awk 'match($0,"IO resumed after") { if (substr($0,RSTART+RLENGTH)+0 > 45) print }'
Run Code Online (Sandbox Code Playgroud)
输出:
foo IO resumed after 45.5 random stuff
foo IO resumed after 46.0 random stuff
foo IO resumed after 46.5 random stuff
foo IO resumed after 47.0 random stuff
foo IO resumed after 47.5 random stuff
foo IO resumed after 48.0 random stuff
foo IO resumed after 48.5 random stuff
foo IO resumed after 49.0 random stuff
foo IO resumed after 49.5 random stuff
foo IO resumed after 50.0 random stuff
Run Code Online (Sandbox Code Playgroud)