如何输出子目录中多个文件中的最后一个匹配项并输出每个匹配项的文件路径

如何输出子目录中多个文件中的最后一个匹配项并输出每个匹配项的文件路径

我已经设法在多个子目录中的多个文件中找到最后一个匹配项,但我还希望输出文件路径,但无法做到。我该如何改变

find subdirprefix* -name log -exec sh -c "tac '{}' | grep -m1 'search string' " \;

这样它就会输出每个文件中的最后一个匹配项和文件路径(相对于起始目录,而不是完整路径)

即输出应该是这样的

[..]search string[..] : subdirprefix1/log
[..]search string[..] : subdirprefix2/log
[..]search string[..] : subdirprefix3/log

答案1

至少使用 GNU grep,您可以使用-H原始文件名来标记输出;当输入通过 stdin 进行管道传输时,使其工作的技巧是使用该--label选项。

例如

find subdirprefix* -name log -exec sh -c '
  tac "$1" | grep -H --label="$1" -m1 "search string"
' find-sh {} \;

或(稍微更有效)

find subdirprefix* -name log -exec sh -c '
  for f; do tac "$f" | grep -H --label="$f" -m1 "search string"; done
' find-sh {} +

(我冒昧地将其'{}'移出 shell scriptlet 并将其作为位置参数传递。)

相关内容