换句话说,如何在bash中组合tail和find / grep命令。我想在回购中找到所有文件(包括子目录中的文件)在最后一行中都有一个特定的单词,在最后一行说FIX。我试过grep -Rl "FIX"
显示所有包含“ FIX”的文件,但我不知道如何在其中组合tail命令。任何人都可以帮助吗?
一次在所有文件上运行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 {} +
如果您想知道最后一行是否与模式匹配,请使用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