如何计算整个文件中字符串的出现次数?

too*_*oop 4 unix linux bash shell perl

是否有一个内置的命令来执行此操作,或者有任何人有运气的脚本吗?

我想要计算某个字符串(不是单词)出现在文件中的次数.这可以包括每行多次出现,因此对于具有2次或更多次字符串的行,计数应计算每次出现不仅计数1.

例如,使用此示例文件:

blah(*)wasp( *)jkdjs(*)kdfks(l*)ffks(dl
flksj(*)gjkd(*
)jfhk(*)fj (*) ks)(*gfjk(*)
Run Code Online (Sandbox Code Playgroud)

如果我想计算字符串的出现次数,(*)我希望计数为6,即第一行为2,第二行为1,第三行为3.请注意第2-3行中的那一行是如何计算的,因为有一个LF字符将它们分开.

更新:到目前为止响应很好!我能问脚本处理的转换(*)\(*\)等?这样我就可以将任何所需的字符串作为输入参数传递,而不必担心需要对其进行哪些转换,因此它以正确的格式显示.

kev*_*kev 21

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

grep -o '(\*)' input.txt | wc -l
Run Code Online (Sandbox Code Playgroud)


TLP*_*TLP 6

使用perl的"Eskimo kiss"操作符和-n开关在末尾打印总计.使用\Q...\E忽略任何元字符.

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

脚本:

use strict;
use warnings;

my $count;
my $text = shift;

while (<>) {
    $count += () = /\Q$text/g;
}

print "$count\n";
Run Code Online (Sandbox Code Playgroud)

用法:

perl script.pl "(*)" file.txt 
Run Code Online (Sandbox Code Playgroud)