使用Grep(或任何其他cmd线工具)来计算包含不同模式的线

时间:2013-05-14 00:05:05

标签: bash shell grep

我正在尝试使用OpenMP,我只是想编写一个小的shell脚本来计算每个线程输出的行数。并简单地吐出每个计数。 我开始进入它,并开始编写带有硬编码或参数化上限和grep -c REG_EX的for循环,我还尝试使用sed首先清理额外的输出以使greps工作更容易,但它不像我想的那样工作

EXAMPLE PROGRAM OUT(SCRIPT INPUT)

Output to STDOUT (I can obviously pipe into sort first):
Thread 0: EXTRA OUTPUT
Thread 0: EXTRA OUTPUT
Thread 2: EXTRA OUTPUT
Thread 3: EXTRA OUTPUT
Thread 0: EXTRA OUTPUT
Thread 1: EXTRA OUTPUT
.
.
.

ETC

我所需要的只是:

Thread 0: #repeats
Thread 1: #repeats
.
.
.
Thread n: #repeats

提前致谢

6 个答案:

答案 0 :(得分:3)

只需输出输出:

grep -o "Thread [0-9]*" | sort | uniq -c | awk '{print $2, $3 ":", $1}'

这将首先将每一行减少到冒号之前的部分(以便给定线程输出的每一行相同),计算每个线程输出的行数,并重新排列uniq的输出以匹配您的样本输出。

答案 1 :(得分:1)

你可以将grep的输出传递给wc(“字数”),它带有-l标志,将计算行数:

grep needle haystack.txt | wc -l

答案 2 :(得分:1)

for i in {0..10}; do
   str="Thread $i:"
   cnt=$(grep -c "$str" input)
   echo "$str $cnt"
done

答案 3 :(得分:1)

我认为awk就足够了。这适用于任意数量的线程..

awk -F ":| " '{a[$2]++; if($2>max) max=$2;} END {for (i=0; i<=max; i++) print "Thread "i": "a[i]}' output

对于您的示例,它将生成..

Thread 0: 3
Thread 1: 1
Thread 2: 1
Thread 3: 1

答案 4 :(得分:0)

要获得匹配模式的行,请使用

grep -v 'pattern' file

获取行,

grep 'pattern' file

要算,

grep -v 'foo' bar.txt | wc -l(与'foo'不匹配的行数)

grep 'foo' bar.txt | wc -l(匹配'foo'的行数#)

这似乎是标题所要求的,但我不得不承认,你的帖子让我困惑

答案 5 :(得分:0)

你需要的只是awk:

<infile awk '{ h[$1" "$2]++ } END { for(k in h) print k, h[k] }'

输出:

Thread 0: 3
Thread 1: 1
Thread 2: 1
Thread 3: 1

如果您只想计算以“Thread”开头的行,请在第一个块前面加上$1 == "Thread" { h[$1" "$2]++ } ...