有没有一个内置的命令来做到这一点,或有任何人有运气的脚本吗?
我正在计算某个string(而不是单词)出现在文件中的次数。 这可以包括每行多个出现次数,因此计数应该计算每次出现次数,而不是只计算1次出现次数为2次或更多次的行。
例如,对于这个示例文件:
blah(*)wasp( *)jkdjs(*)kdfks(l*)ffks(dl flksj(*)gjkd(* )jfhk(*)fj (*) ks)(*gfjk(*)
如果我正在计算string(*)
的出现次数,我预计计数为6,即从第一行开始2,从第二行开始1,从第三行开始3。 请注意2-3行之间的数字如何不计算,因为有一个LF字符将它们分开。
更新 :到目前为止的回应! 我可以要求脚本处理(*)
到\(*\)
等的转换吗? 这样我就可以传递任何需要的string作为input参数,而不用担心需要对其进行什么样的转换,以便以正确的格式显示。
使用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
这应该是诀窍。 如果我觉得再次浏览perlun ,我可能会看到一个更优雅的解决方案,但这应该是有效的。
你也可以通过给regexp提供列表上下文来消除显式的inner 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 fileName | wc -l
text="(\*)" grep -o $text file | wc -l
你可以把它变成一个接受这样的参数的脚本:
脚本数量 :
#!/bin/bash text="$1" file="$2" grep -o "$text" "$file" | wc -l
用法:
./count "(\*)" file_path