我如何要求grep在忽略其他字符串的情况下返回与字符串匹配的文件名?

时间:2019-04-25 17:45:01

标签: awk grep

我有多个日志文件,我想搜索错误。这些文件还包含一堆警告,被称为错误和其他错误警报。

现在,我有一个令人费解的过程来查找我想更仔细检查的文件:

grep error *.out | grep -v -e warning -e handle -e Sentry -e exitfuncs | \
awk -F: '{print $1}' | uniq

我怀疑这可能更简洁,但是我不能完全让grep做到这一点。帮助吗?

输入:

file1.out
error. bad things happened.
error. warning, function deprecated
error. no really, this is bad.

file2.out
error. warning, function deprecated
error. warning, function deprecated

file3.out
error. warning, function deprecated
error. another bad thing here.

所需的输出:

file1.out
file3.out

当前命令的说明: grep错误* .out返回示例文件中的每一行:

file1.out: error. bad things happened.
file1.out: error. warning, function deprecated
...
file3.out: error. another bad thing here.

grep -v -e warning清除警告。 awk -F:将字段分隔符设置为:,并从输入中返回第一个字段,即文件名。 uniq会对文件名进行重复数据删除,因此file1.out不会出现两次。

1 个答案:

答案 0 :(得分:0)

grep是用来做g/re/p的-仅此而已。对于任何比这更复杂的事情,只需使用awk。您可以替换整个命令行并仅通过一次调用awk来打印文件名:

awk -F':' '/error/ && !/warning|handle|Sentry|exitfuncs/ && !seen[FILENAME,$1]++{print FILENAME, $1}' *.out

但是可能有更好的方法,具体取决于您输入的内容,我们也没有看到您想要的输出,所以我只是在猜测您想要uniq做的wrt文件名和错误值并idk您希望整体输出是什么样子...