是否有一个内置的命令来完成这或有没有人有一个脚本,做任何运气?
我期待计数某些字符串(不是字)出现在文件的次数。 这可以包括每行多次出现这样的计算应该每次发生不只是数1对具有弦2次以上线。
例如,对于此示例文件:
blah(*)wasp( *)jkdjs(*)kdfks(l*)ffks(dl
flksj(*)gjkd(*
)jfhk(*)fj (*) ks)(*gfjk(*)
如果我期待计数字符串的出现次数(*)
我期望的计数为6的,即从2从第三行中的第二行和图3的第一行,1。 注意如何在线路2-3的一个不计,因为有一个LF字符分隔。
到目前为止,大对策: 更新 ! 我能问脚本处理的转换(*)
以\(*\)
等等? 这样,我可以只通过任何所需的字符串作为输入参数,而不必担心需要的东西转换做它,因此它出现在正确的格式。
使用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
您可以使用基本的工具,如grep
和wc
:
grep -o '(\*)' input.txt | wc -l
这遍历文件的行,每行找到字符串“(*)”的所有事件。 每个字符串被发现的时候,$ 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命令:
例如 :如果你想找到没有“你好”字出现在一个文件中
grep -c "hello" filename
如果你想找到一个模式的出现没有那么
grep -c -P "Your Pattern"
图案例如:hell.w,\ d +等
我用下面的命令来查找特定的字符串计数文件
grep的search_string的文件名|厕所-l
text="(\*)"
grep -o $text file | wc -l
你可以把它变成它接受参数,像这样的脚本:
脚本计数 :
#!/bin/bash
text="$1"
file="$2"
grep -o "$text" "$file" | wc -l
用法:
./count "(\*)" file_path