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

问题描述 投票:0回答:6

是否有内置命令可以执行此操作,或者是否有人幸运地使用了执行此操作的脚本?

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

例如,使用此示例文件:

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

如果我想计算字符串的出现次数

(*)
,我希望计数为 6,即第一行 2 次,第二行 1 次,第三行 3 次。请注意第 2-3 行之间的那一行不算数,因为有一个 LF 字符将它们分开。

更新:到目前为止反应很好!我可以要求脚本处理

(*)
\(*\)
等的转换吗?这样我就可以将任何所需的字符串作为输入参数传递,而不必担心需要对其进行哪些转换,以便它以正确的格式显示。

linux perl bash shell unix
6个回答
24
投票

您可以使用

grep
wc
等基本工具:

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

更新:

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

添加

-F
选项将 PATTERNS 解释为固定字符串,而不是正则表达式。


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
投票

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


1
投票

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

示例:如果你想查找文件中“hello”一词出现的次数

grep -c "hello" filename

如果您想查找某个模式出现的次数,那么

grep -c -P "Your Pattern"

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


0
投票

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

grep search_String 文件名|wc -l


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

您可以将其制作成接受如下参数的脚本:

脚本计数

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

用途:

./count "(\*)" file_path
© www.soinside.com 2019 - 2024. All rights reserved.