是否有内置命令可以执行此操作,或者是否有人幸运地使用了执行此操作的脚本?
我想计算某个字符串(不是单词)在文件中出现的次数。这可以包括每行多次出现,因此计数应该对每次出现进行计数,而不仅仅是对包含该字符串 2 次或多次的行计数 1。
例如,使用此示例文件:
blah(*)wasp( *)jkdjs(*)kdfks(l*)ffks(dl
flksj(*)gjkd(*
)jfhk(*)fj (*) ks)(*gfjk(*)
如果我想计算字符串的出现次数
(*)
,我希望计数为 6,即第一行 2 次,第二行 1 次,第三行 3 次。请注意第 2-3 行之间的那一行不算数,因为有一个 LF 字符将它们分开。
更新:到目前为止反应很好!我可以要求脚本处理
(*)
到 \(*\)
等的转换吗?这样我就可以将任何所需的字符串作为输入参数传递,而不必担心需要对其进行哪些转换,以便它以正确的格式显示。
您可以使用
grep
和wc
等基本工具:
grep -o '(\*)' input.txt | wc -l
更新:
grep -o -F '(*)' input.txt | wc -l
添加
选项将 PATTERNS 解释为固定字符串,而不是正则表达式。-F
使用 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
这会循环文件的行,并在每一行上查找所有出现的字符串“(*)”。 每次找到该字符串时,$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
您可以使用基本的 grep 命令:
示例:如果你想查找文件中“hello”一词出现的次数
grep -c "hello" filename
如果您想查找某个模式出现的次数,那么
grep -c -P "Your Pattern"
模式示例:hell.w、\d+等
我使用下面的命令来查找文件中的特定字符串计数
grep search_String 文件名|wc -l
text="(\*)"
grep -o $text file | wc -l
您可以将其制作成接受如下参数的脚本:
脚本计数:
#!/bin/bash
text="$1"
file="$2"
grep -o "$text" "$file" | wc -l
用途:
./count "(\*)" file_path