在多个文件中查找最后一次出现的字符串

Lok*_*esh 10 grep bash shell-script text-processing

我需要搜索多个日志文件(过去 24 小时内生成的所有文件,都保存在同一目录中)以找到最后一次出现的字符串。这是我写的命令:

find . -mtime 1 | grep fileprefix | xargs grep 'search string' | tail -1
Run Code Online (Sandbox Code Playgroud)

但这仅返回一个文件的最后一行。关于如何调整它以获得所有线条的任何建议?

ter*_*don 8

如果所有内容都在一个目录中,您可以执行以下操作:

for file in *fileprefix*; do
    grep 'search string' "$file" | tail -1
done
Run Code Online (Sandbox Code Playgroud)

如果这些是大文件,可能值得通过使用tac以相反的顺序打印文件(最后一行在前)然后grep -m1匹配第一次出现来加快速度。这样,您就不必读取整个文件:

for file in *fileprefix*; do
    tac file | grep -m1 'search string'
done
Run Code Online (Sandbox Code Playgroud)

两者都假设没有匹配的目录fileprefix。如果有,你会得到一个你可以忽略的错误。如果这是一个问题,请仅检查文件:

 for file in *fileprefix*; do
    [ -f "$file" ] && tac file | grep -m1 'search string'
 done
Run Code Online (Sandbox Code Playgroud)

如果您还需要打印文件名,请添加-H到每个grep调用中。或者,如果您grep不支持它,请告诉它也搜索/dev/null. 这不会改变输出,但由于grep给出了多个文件,它总是会为每个命中打印文件名:

for file in *fileprefix*; do
    grep 'search string' "$file" /dev/null | tail -1
done
Run Code Online (Sandbox Code Playgroud)


iru*_*var 4

假设 GNU 设施:

find . -mtime -1 -exec bash -c \
'for f; do tac "$f" | grep -m1 fileprefix; done' _ {} +
Run Code Online (Sandbox Code Playgroud)