复杂的 grep 显示文件名和最后匹配项下方的行

complex grep show file name and lines below last match

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

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

我试过添加 -A 2 但是 return 行下面没有 returned,我尝试在 grep 之后添加 file /dev/null 来打印文件名,但出现错误

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

添加 -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 忽略管道输入。