![用唯一计数和字符串来 grep 多行](https://linux22.com/image/1394848/%E7%94%A8%E5%94%AF%E4%B8%80%E8%AE%A1%E6%95%B0%E5%92%8C%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%9D%A5%20grep%20%E5%A4%9A%E8%A1%8C.png)
样本.csv
DSN1,abc,FAILURE,12,24,45
DSN1,def,FAILURE,12,78,65
DSN1,abc,FAILURE,12,24,45
DSN1,abc,FAILURE,12,24,45
DSN1,abc,FAILURE,12,24,45
DSN1,def,FAILURE,12,78,65
DSN1,abc,FAILURE,12,24,45
我需要上述 sample.csv 中的失败次数,响应如下
abc 5
def 2
但是我没有在脚本中提到 abc/def。因为我已经给出了一个示例场景,在我的例子中,其中有很多像 abc 这样的字符串,所以我需要该字符串并计算失败次数。
请建议我
提前致谢
答案1
一个简单的解决方案是使用以下管道:
<Sample.csv grep '^[^,]*,[^,]*,FAILURE' | cut -d, -f2 | sort | uniq -c
grep
FAILURE
将提取第三列中的行cut
将提取列(分隔,
符列号2
)sort
将对提取的列进行排序(相同的值将彼此相邻。)uniq
将删除重复的值,该-c
选项将显示每个唯一值的计数
您还可以根据需要将其他过滤器插入管道。(例如grep
在开始时)。
答案2
Ricky 的评论就是我会如何做,但如果您想要一个特定于 grep 的解决方案,您可以执行以下操作:
$ for i in {abc,def}; do echo -n "$i: "; grep -c $i input.txt; done;
这将输出预期的内容:
abc:5
def:2
更新
如果您不想在 for 循环中包含搜索键,我不知道如何仅使用 grep 来做到这一点。
但是您可以使用 awk 来完成。
awk 'BEGIN{FS=","}//{a[$2]++}END{for(x in a) print x,a[x]}' test.txt
解释:
FS="," -- 将记录分隔符设置为逗号
// -- 匹配所有行
我们创建一个名为“a”的关联数组
a[$2]++ -- 每一个匹配的模式我们取第二列并增加计数
END { .. }——完成所有匹配后运行此块。我们遍历所有元素打印键和计数。
答案3
请找到相同的:
awk < Sample.txt -F',' '{print $2}' | sort |uniq -c| grep "FAILURE"
谢谢你的回答:)