首页 > 解决方案 > 复杂的 grep 显示文件名和最后一个匹配下面的行

问题描述

我有一个 shell 命令来向后 grep 的匹配"___",我需要一种方法来查看此匹配下方的 + 两行,并将文件名附加到 grep 输出的开头。

for f in $(find . -name "*.log"); do tac $f | grep "___" | head -n 1; done

我已经尝试添加-A 2,但它不会在返回的内容下方返回行,我尝试file /dev/null在 grep 之后添加以使其打印文件名,但出现错误

for f in $(find . -name "*.log"); do tac $f | grep "___" file /dev/null | head
 -n 1; done
grep: file: No such file or directory

标签: bashgrep

解决方案


将 -A 2 添加到 grep 是行不通的,因为您将它输送到head -n 1.

由于您只想要一个匹配,您可以添加-m 1以告诉 grep 在 1 个匹配后停止,而不是通过管道进入head -n 1

由于您已反转文件,您可能希望使用 -B 2 (-B 表示之前而不是 -A 表示之后)。
匹配后,您可能希望再次反转,tac以便匹配类似于实际文件内容。

至于添加文件名:你已经有它$f,只是echo它。

所有这些都像: for f in $(find . -name "*.log"); do echo "${f}:"; tac ${f} | grep -m 1 -A 2 "___" | tac; done

当您添加file /dev/null到 grep 时,您将为其提供更多参数以进行搜索,这就是为什么您收到未找到的错误,因为您的路径中file没有命名文件。file我相信当您将输入管道输入到 grep 时,这个技巧将不起作用,因为向 grep 提供文件会导致 grep 忽略管道输入。


推荐阅读