复杂的 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 忽略管道输入。
我有一个 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 忽略管道输入。