0

我有一个日志文件和以下命令

grep '"REFERENCE":"78","STATUS":"Buffered"' file.log | wc -l
grep '"REFERENCE":"78","STATUS":"Delivered"' file.log | wc -l
grep '"REFERENCE":"78","STATUS":"Not Delivered"' file.log | wc -l

有没有办法使用一个衬里来获得如下输出:

Buffered: 30
Delivered: 1200
Not Delivered: 589

输出不必完全相同。

4

3 回答 3

1

我只是找到解决问题的方法,从这里借来的

grep -oP '"REFERENCE":"79","STATUS":".*?"' file.log | sort | uniq -c

示例输出:

15605 "REFERENCE":"79","STATUS":"Buffered"
24280 "REFERENCE":"79","STATUS":"Delivered"
10224 "REFERENCE":"79","STATUS":"Not Delivered"
于 2012-09-18T17:19:31.887 回答
0

当然,不是计算行数,而是考虑 grep 的 -c 开关 - 它返回找到的匹配数,并在 bash 中返回 $() 或 SINGLEQUOTEcommandSINGLEQUOTE 语法,然后将其与 bash 简单算术 $(($X+$Y)) 组合成一个命令,类似于:

OUTCOUNT=$((`grep -c aaa file1.txt` + `grep -c bbb file2.txt` + `grep -c ccc file3.txt`))
于 2012-09-18T17:05:03.227 回答
0

用于awk提取所需行并仅输出状态,然后使用sortanduniq获取每个唯一状态的计数:

awk -F, '/"REFERENCE":"78"/ { print $2 }' | sort | uniq -c

根据您输入行的确切格式,可能需要调整此答案。我现在假设逗号分隔行中的第二个字段是"STATUS":"<status>".

于 2012-09-18T17:20:49.440 回答