我已经设法在多个子目录中的多个文件中找到最后一个匹配项,但我还希望输出文件路径,但无法做到。我该如何改变
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 并将其作为位置参数传递。)