首页 > 解决方案 > 如何让 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 error *.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 不会出现两次。

标签: awkgrep

解决方案


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

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

但可能有更好的方法取决于您的输入是什么样的,我们还没有看到您想要的输出,所以我只是猜测您想要uniq做什么 wrt 文件名加上错误值和 idk 您想要的整体输出看起来像...


推荐阅读