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

时间:2012-04-12 08:02:50

标签: linux perl bash shell unix

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

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

例如,使用此示例文件:

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

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

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

6 个答案:

答案 0 :(得分:21)

您可以使用grepwc等基本工具:

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

答案 1 :(得分:6)

使用perl的“Eskimo kiss”操作符和-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 

答案 2 :(得分:2)

这循环遍历文件的行,并在每一行上查找字符串“(*)”的所有出现。每次找到该字符串时,$ 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

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

您还可以通过向正则表达式提供列表上下文来消除显式内部while循环而支持隐式循环:

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

答案 3 :(得分:1)

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

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

grep -c "hello" filename

如果你想找到一个模式的出现,那么

grep -c -P "Your Pattern"

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

答案 4 :(得分:0)

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

grep search_String fileName | wc -l <​​/ p>

答案 5 :(得分:-1)

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

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

脚本计数

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

用法:

./count "(\*)" file_path