0

我必须从文件中获得一定的数量。我使用的 grep 语句是这样的:

counter_pstn=0
completed_count_pstn=0
rec=0
for rec in `(grep "merged" update_completed*.log | awk '{print $1}' | sed 's/ //g' | cut -d':' -f2)`
do
if [ $counter_pstn -eq 0 ]
then
completed_count_pstn=$rec
else
completed_count_pstn=$(($completed_count_pstn+$rec))
fi
counter_pstn=$(($counter_pstn+1))
done
echo "Completed Orders PSTN Primary " $completed_count_pstn

但是日志文件包含这种格式的数据:

2500 rows merged.
2500 rows merged.
2500 rows merged.
2500 rows merged.2500 rows merged.
2500 rows merged.
2500 rows merged.

结果,它错过了一次合并的计数(例如在输出的第 4 行)。我如何修改 grep 或使用另一个函数来获取计数。请注意,2500 数字可能用于不同的日志。所以我们必须使用“合并的行”模式来获取计数。我试过 -o ,-w grep 选项,但它不起作用。

上述数据的预期输出:

17500

实际输出显示:

15000
4

3 回答 3

2
perl -p -lne 's/merged./merged.\n/g' your_file|awk '{a+=$1}END{print a}'
于 2012-11-16T11:10:33.533 回答
2

只需将 awk 与 '.' 一起使用。作为记录分隔符,因为这似乎是您想要指示每条记录结尾的内容:

$ cat file
2500 rows merged.
2500 rows merged.2500 rows merged.
2500 rows merged.

$ awk -v RS='.' '/merged/{sum+=$1} END{print "sum=" sum}' file
sum=10000
于 2012-11-16T13:00:46.277 回答
0

你的 grep -V 输出是什么?

无论如何,你可以在没有 grep 的情况下做到这一点:

sed 's/merged\./\n/g' file|awk '{x+=$1}END{print x}'

测试

kent$  echo "2500 rows merged.
2500 rows merged.
2500 rows merged.
2500 rows merged.2500 rows merged.
2500 rows merged.
2500 rows merged."|sed 's/merged\./\n/g'|awk '{x+=$1}END{print x}'                                                                                                         
17500
于 2012-11-16T11:00:10.627 回答