我怎样才能找到一些管道('|')?

时间:2009-03-04 22:00:55

标签: grep

我试过了:

 grep -c "\|" *.* 

但它不起作用,因为它给出了连续管道的错误计数。

我该如何做到这一点?

5 个答案:

答案 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的教程