如何使用grep提取无重复的字符串模式 解决输出重复问题
grep匹配结果按目标字符串去重方案
方案1:保留原输出的文件名、行号信息,每个目标字符串仅保留第一条匹配记录
直接在原有grep命令后拼接awk处理逻辑即可:
grep -Enro --exclude=\*features.cc --exclude=\*.h --exclude=\*switches.cc '\bk[A-Z]\w*' ./* | awk -F: '!seen[$NF]++'
逻辑说明:
- 原有grep输出格式为
文件路径:行号:匹配到的字符串,以冒号为分隔符时,$NF代表每行最后一个字段,也就是你要匹配的k开头目标字符串 - awk用关联数组
seen记录每个字符串的出现次数,第一次遇到该字符串时!seen[$NF]结果为真,会打印当前行;后续再遇到相同字符串时判断为假,跳过输出,刚好实现保留首次匹配记录的需求
方案2:仅需要去重后的目标字符串列表,不需要来源信息
可以给grep增加-h参数取消输出文件名、行号前缀,再去重:
grep -Eroh --exclude=\*features.cc --exclude=\*.h --exclude=\*switches.cc '\bk[A-Z]\w*' ./* | awk '!seen[$0]++'
该方案输出结果仅为所有匹配到的无重复k开头字符串,保留首次出现的顺序。
可选:不要求保留出现顺序的简化写法
如果不需要保留字符串首次出现的先后顺序,可以用sort -u替换awk部分,写法更简单:
# 保留来源信息的版本 grep -Enro --exclude=\*features.cc --exclude=\*.h --exclude=\*switches.cc '\bk[A-Z]\w*' ./* | sort -t: -k3 -u # 仅输出字符串的版本 grep -Eroh --exclude=\*features.cc --exclude=\*.h --exclude=\*switches.cc '\bk[A-Z]\w*' ./* | sort -u
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

