我想计算一条线上的匹配数(或所有线,因为总是只有一条线)。
我想要计算的不是每行一个匹配,如
echo "123 123 123" | grep -c -E "123" # Result: 1
更好的例子:
echo "1 1 2 2 2 5" | grep -c -E '([^ ])( \1){1}' # Result: 1, expected: 2 or 3
答案 0 :(得分:50)
您可以使用grep -o
然后管道wc -l
:
$ echo "123 123 123" | grep -o 123 | wc -l
3
答案 1 :(得分:1)
也许你应该首先将空格转换为换行符:
$ echo "1 1 2 2 2 5" | tr ' ' $'\n' | grep -c 2
3
答案 2 :(得分:0)
也许在下面:
echo "123 123 123" | sed "s/123 /123\n/g" | wc -l
(也许很难看,但我的bash fu不是那么好)
答案 3 :(得分:0)
为什么不使用awk?
你可以使用awk '{print gsub(your_regex,"&")}'
打印每行的匹配数,或
awk '{c+=gsub(your_regex,"&")}END{print c}'
打印匹配总数。请注意,相对速度可能会有所不同,具体取决于使用的awk实现以及给出的输入。
答案 4 :(得分:0)
这可能对您有用:
sed -n -e ':a' -e 's/123//p' -e 'ta' file | sed -n '$='
GNU sed可以写成:
sed -n ':;s/123//p;t' file | sed -n '$='