我正在尝试运行find
命令来查找特定文本字符串出现的总数以及具有该文本字符串的文件的数量。
我现在拥有的就是这个命令。
find . -name "*.txt" | xargs grep -i "abc"
这会报告所有包含文本“abc”的“*.txt”文件。我想要一个或两个 find 命令来获取
- abc 出现的总次数
- 包含 abc 的文件总数。
答案1
对于问题1,你可以这样做:
find . -name "*.txt" | xargs grep -i "abc" | wc -l
这计算了匹配的总数ABC在所有文本文件中。
对于问题 2,我想出了:
find . -name "*.txt" -exec grep -i "abc" {} + | cut -d: -f1 | sort | uniq | wc -l
这仅从匹配列表中获取唯一的文件名并对它们进行计数(可能不需要排序)。
正如 Miracle173 所指出的,grep
带有“每个文件一次匹配”标志,因此命令可以缩短为:
find . -name "*.txt" -exec grep -il "abc" {} + | wc -l
答案2
grep 的-c
选项就是你需要的
find . -name \*txt | xargs grep -c -i "abc" | {
total=0
count=0
while IFS=: read name num; do
((num > 0)) && ((count+=1))
((total+=num))
done
echo total=$total
echo count=$count
}
需要使用大括号将命令分组到while
循环周围,以将变量保留在该子 shell 的一个范围内。
答案3
$ grep -R --include='*.txt' -c -i abc . | awk -F: '
BEGIN {
totalCount=0;noOfFiles=0;
}
{ totalCount=totalCount+$2;
if ( $2 > 0 )
{
noOfFiles+=1;
}
}
END {
print "Total number of times abc appears:"totalCount;
print "Total number of files which has abc in it:"noOfFiles
} '
(或者)
ls 输出不应该被其他程序用来解析。请参阅下面的评论。
$ ls -Rltr | awk '/.txt/{print $NF }' | xargs grep -c -i "abc" | awk -F: '
BEGIN {
totalCount=0;noOfFiles=0;
}
{ totalCount=totalCount+$2;
if ( $2 > 0 )
{
noOfFiles+=1;
}
}
END {
print "Total number of times abc appears:"totalCount;
print "Total number of files which has abc in it:"noOfFiles
} '
Result:
Total number of times abc appears:0
Total number of files which has abc in it:0
答案4
文件中包含的 abc 数量:
要计算 .txt 文件中所有“abc”的数量,请使用 grep -c 并 find 和 - 例外 - cat:
find . -name "*.txt" -exec cat {} + | grep -ic abc
Grep -c 将为你计算总数 - 我在 SigueSigueBen 的答案中没有找到这个答案,其中包含对 的不合理调用xargs
,恕我直言。另外两个回答了我渴望的地方。我没有研究过它们,我自己也不会写这样的东西。
包含 abc 的文件数量:
find . -name "*.txt" -exec grep -iq abc {} ";" -printf "1" | wc -c
对于名称中包含换行符的文件名(我承认,这种情况很少见)(这是完全合法的),这不会失败。