4

是否有内置命令可以执行此操作,或者是否有人对执行此操作的脚本有任何运气?

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

例如,使用此示例文件:

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

如果我要计算字符串的出现次数,(*)我希望计数为 6,即第一行有 2 个,第二行有 1 个,第三行有 3 个。请注意第 2-3 行之间的行数不算数,因为它们之间有一个 LF 字符。

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

4

6 回答 6

22

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

grep -o '(\*)' input.txt | wc -l
于 2012-04-12T08:08:37.940 回答
6

使用 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 
于 2012-04-12T09:40:31.980 回答
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

于 2012-04-12T08:05:49.560 回答
1

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

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

grep -c "hello" filename

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

grep -c -P "Your Pattern"

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

于 2016-06-02T15:18:43.573 回答
0

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

grep search_String 文件名|wc -l

于 2017-01-12T07:02:50.840 回答
-1
text="(\*)"
grep -o $text file | wc -l

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

脚本计数

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

用法:

./count "(\*)" file_path
于 2015-04-27T11:25:31.520 回答