是否有一个内置命令来执行此操作,或者有任何人对运行它的脚本有任何好运?
我希望计算某个字符串(不是单词)出现在文件中的次数。这可以包括每行多次出现,因此对于具有2次或更多次字符串的行,计数应该计算每次出现而不仅仅是计数1。
例如,使用此示例文件:
blah(*)wasp( *)jkdjs(*)kdfks(l*)ffks(dl
flksj(*)gjkd(*
)jfhk(*)fj (*) ks)(*gfjk(*)
如果我想要计算字符串(*)
的出现次数,我希望计数为6,即第一行为2,第二行为1,第三行为3。注意第2-3行中的那一行是如何计算的,因为有一个LF字符将它们分开。
更新:到目前为止回复率很高!我可以要求脚本处理(*)
到\(*\)
等的转换吗?这样我就可以将任何所需的字符串作为输入参数传递,而不必担心需要对其进行哪些转换,因此它以正确的格式显示。
答案 0 :(得分:21)
您可以使用grep
和wc
等基本工具:
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