我试过了:
grep -c "\|" *.*
但它不起作用,因为它给出了连续管道的错误计数。
我该如何做到这一点?
答案 0 :(得分:10)
您可以使用tr(1)
删除所有非管道字符,然后使用wc(1)
获取总数:
cat *.* | tr -d -c '|' | wc -c
答案 1 :(得分:6)
这是违反直觉的,但在大多数unix正则表达式中,转义|
使其成为or-operator。所以你的线实际上匹配“什么都没有”(你可以通过在任何一方添加一些替代品来测试它)。只需使用
grep -c "|" *.*
其次,grep计算行数,而不是字符出现次数。你可以使用不同的工具;或者,如果你坚持grep,你可以把每个“|”在自己的路线上。例如,使用sed:
sed 's/|/|\n/g' *.*
注意:如果使用sed,我会建议批次进行测试,以确保它能够按照您的想法执行。我当时需要。
最后,结合成分:
cat *.* | sed 's/|/|\n/g' | grep -c "|"
不幸的是,这可能不适合你,因为你可能没有使用unix(因为*.*
)。但希望它能解释这个问题,我总觉得这个问题让人感到奇怪。
答案 2 :(得分:3)
使用Perl的另一个选择是:
perl -e 'while(<>){$c+=tr/|/|/};print "$c\n"' *
非单行格式:
while(<>){
$c += tr/|/|/
}
print "$c\n"
while(<>){
行是Perl魔术用于从命令中的文件或STDIN
读取行。你过了一会儿就习惯了。该行本身进入一个名为$_
的变量,这是许多Perl命令的默认参数。例如tr
,其工作方式与tr(1)
非常相似,默认为$_
。我将结果放在一个名为$c
的全局变量中。 (在完整的程序中,最好在循环外声明它是my $c = 0;
的词法变量。)+=
运算符添加tr
命令的结果(管道符的数量)这种情况)到当前值$c
。
使用tr(1)
显然是一个更简单的选择。 ; - )
使用*.*
是一种DOS主义,你不太可能想在类UNIX平台上使用它。
使用单引号来避免shell解释管道字符会更好一些。例如,我用以下方法测试了我的答案:
$ echo '||||
|||||' | perl -e 'while(<>){$c+=tr/|/|/};print "$c\n"'
9
答案 3 :(得分:0)
如果你想找到一些管道,那么
fgrep -o "|" | wc -l
如果要查找至少包含一个管道的行数,则
fgrep -c "|"
答案 4 :(得分:-3)
试
grep -c "\|" *.*
阅读一些关于bash的教程