如何计算整个文件中string的出现次数?

有没有一个内置的命令来做到这一点,或有任何人有运气的脚本吗?

我正在计算某个string(而不是单词)出现在文件中的次数。 这可以包括每行多个出现次数,因此计数应该计算每次出现次数,而不是只计算1次出现次数为2次或更多次的行。

例如,对于这个示例文件:

blah(*)wasp( *)jkdjs(*)kdfks(l*)ffks(dl flksj(*)gjkd(* )jfhk(*)fj (*) ks)(*gfjk(*) 

如果我正在计算string(*)的出现次数,我预计计数为6,即从第一行开始2,从第二行开始1,从第三行开始3。 请注意2-3行之间的数字如何不计算,因为有一个LF字符将它们分开。

更新 :到目前为止的回应! 我可以要求脚本处理(*)\(*\)等的转换吗? 这样我就可以传递任何需要的string作为input参数,而不用担心需要对其进行什么样的转换,以便以正确的格式显示。

使用perl的“爱斯基摩吻”操作符和-n开关打印总计。 使用\Q...\E忽略任何元字符。

 perl -lnwe '$a+=()=/\Q(*)/g; }{ print $a;' file.txt 

脚本:

 use strict; use warnings; my $count; my $text = shift; while (<>) { $count += () = /\Q$text/g; } print "$count\n"; 

用法:

 perl script.pl "(*)" file.txt 

您可以使用基本的工具,如grepwc

 grep -o '(\*)' input.txt | wc -l 

这遍历文件的行,并在每一行找到所有出现的字符串“(*)”。 每找到一个字符串,$ c就会递增。 当没有更多行循环时,将打印$ c的值。

perl -ne'$c++ while /\(\*\)/g;END{print"$c\n"}' filename.txt

更新:关于你的评论要求这被转换成接受正则表达式作为参数的解决方案,你可以这样做:

perl -ne'BEGIN{$re=shift;}$c++ while /\Q$re/g;END{print"$c\n"}' 'regex' filename.txt

这应该是诀窍。 如果我觉得再次浏览perlun ,我可能会看到一个更优雅的解决方案,但这应该是有效的。

你也可以通过给regexp提供列表上下文来消除显式的inner while循环,

perl -ne'BEGIN{$re=shift}$c+=()=/\Q$re/g;END{print"$c\n"}' 'regex' filename.txt

你可以使用基本的grep命令:

例如 :如果你想在文件中找到“hello”字的出现次数

 grep -c "hello" filename 

如果你想找到一个模式的发生没有那么

 grep -c -P "Your Pattern" 

模式示例: hell.w,\ d +

我已经使用下面的命令来查找文件中特定的字符串计数

grep search_String fileName | wc -l

 text="(\*)" grep -o $text file | wc -l 

你可以把它变成一个接受这样的参数的脚本:

脚本数量

 #!/bin/bash text="$1" file="$2" grep -o "$text" "$file" | wc -l 

用法:

 ./count "(\*)" file_path