Shell 使用grep和wc同时对结果进行过滤和计数

Shell 使用grep和wc同时对结果进行过滤和计数,shell,grep,wc,Shell,Grep,Wc,我的项目是过滤列表中的电话号码,里面有很多东西。 所以我想显示我已经过滤过的电话号码,与电话号码对应的行号。 我只过滤美国电话号码。 规则是使用管道 grep "^([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$" $1 | wc -l > result-phonenumber-filter.txt data.txt包含我们需要过滤的数字: (512) 258-6589 (205) 251-6

我的项目是过滤列表中的电话号码,里面有很多东西。 所以我想显示我已经过滤过的电话号码,与电话号码对应的行号。 我只过滤美国电话号码。 规则是使用管道

   grep  "^([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$" $1 | wc -l  > result-phonenumber-filter.txt 
data.txt包含我们需要过滤的数字:

      (512) 258-6589

    (205) 251-6584

    (480) 589-9856

    (303) 548-9874

    (808) 547-3215

    (270) 987-6547

    (225) 258-9887

    (314) 225-2543

    (979) 547-6854

    (276) 225-6985

    les numeros suivants ne sont pas valables pour ce programme :

    +512 325

+512 251 2545654654

+512 6546 6464646

+512546546646564646463313

(314) sgf225-2543

(314) 225-2543fsgaf

(314afd) 225-2543

FSd(314) 225-2543
我想得到的结果是:

(512) 258-6589
(205) 251-6584
(480) 589-9856
(303) 548-9874
(808) 547-3215
(270) 987-6547
(225) 258-9887
(314) 225-2543
(979) 547-6854
(276) 225-6985

The number of line is :10

这是不必要的棘手,但它在不创建任何临时文件的情况下工作。进程替换需要bash

grep -oP '^\s*\(\d{3}\) \d{3}-\d{4}\s*$' file | tee >(echo "there are $(wc -l) matches")
我会选择awk或perl

perl -ne '
    if (/^\s*\(\d{3}\) \d{3}-\d{4}\s*$/) {print; $count++} 
    END {print "there are $count matches\n"}
' file

这是不必要的棘手,但它在不创建任何临时文件的情况下工作。进程替换需要bash

grep -oP '^\s*\(\d{3}\) \d{3}-\d{4}\s*$' file | tee >(echo "there are $(wc -l) matches")
我会选择awk或perl

perl -ne '
    if (/^\s*\(\d{3}\) \d{3}-\d{4}\s*$/) {print; $count++} 
    END {print "there are $count matches\n"}
' file

谢谢你的帮助谢谢你的帮助你能解释一下这部分吗?我试图单独理解,但我想我不太明白这里附加了什么。它删除了行开头的空格和制表符,尝试在没有sed部分的情况下运行它,您应该理解它。谢谢您的回答/^[\t]*/'您能解释一下这部分吗?我试图单独理解,但我想我不太明白这里附加了什么。它删除了行开头的空格和制表符,尝试在没有sed部分的情况下运行它,您应该理解它。谢谢您的回答
awk '
    /^[[:blank:]]*\([[:digit:]]{3}\) [[:digit:]]{3}-[[:digit:]]{4}[[:blank:]]*$/ {print; count++} 
    END {print "there are", count, "matches"}
' file