如何在我的仓库中查找最后一行中有特定单词的每个文件?

问题描述 投票:0回答:2

换句话说,如何在bash中组合tail和find / grep命令。我想在回购中找到所有文件(包括子目录中的文件)在最后一行中都有一个特定的单词,在最后一行说FIX。我试过grep -Rl "FIX"显示所有包含“ FIX”的文件,但我不知道如何在其中组合tail命令。任何人都可以帮助吗?

bash find tail
2个回答
0
投票

一次在所有文件上运行tail,然后grep FIX的输出。给定多个文件名时,由于tail在每一行之前都添加了相应的文件名,所以您要做的就是这些。

find -type f -exec tail -n1 {} + | grep FIX

或使用**查找所有文件和子目录,然后一次在每个文件和子目录上运行tail

shopt -s globstar
for file in **; do
    [[ -f $file ]] && tail -n1 "$file" | grep -q FIX && echo "$file"
done

或使用find查找所有匹配项并将其通过管道传递到while read循环:

find -type f -print0 | while IFS= read -rd '' file; do
    tail -n1 "$file" | grep -q FIX && echo "$file"
done

或执行相同的操作,但使用-exec +和显式子外壳:

find -type f -exec sh -c 'for file; do tail -n1 "$file" | grep -q FIX && echo "$file"; done' sh {} +

0
投票

如果您想知道最后一行是否与模式匹配,请使用sed,并使用$将匹配限制在最后一行。 sed不会轻易提供返回值或像grep那样漂亮地打印文件名,但可以完成工作。

find . -exec sh -c "sed -n '$ { /FIX/p; }' {} | grep -q . " \; -print

[这里,我们使用-n禁止打印,然后仅在最后一行与模式/p匹配时才打印(使用/FIX/)。输出通过管道传递到grep,以获取返回值,find使用该返回值来确定是否-print名称。

或者,您可以通过执行类似的操作来避免使用grep进行退货:

find . -exec awk 'END{ exit ! match($0, "FIX")}' {} \; -print
© www.soinside.com 2019 - 2024. All rights reserved.