我有一个包含模块和查询的日志文件,按照这个顺序:
com.ab
com.ab
com.ac
com.ad
com.ab
com.ac
com.ad
因此我使用下面的grep命令来删除重复项:
grep -m1 'com.a' filename
,但它没有给出正确的输出,因为我想要的输出是这样的,它删除重复,并找到不同的模式:
com.ab
com.ac
com.ad
如何使用grep
实现上述输出可以使用
grep -F 'com.a' file | sort -u
awk '/com.a/' file | sort -u
awk 'index($0, "com.a")' file | sort -u
awk 'index($0, "com.a") && !seen[$0]++' file
这里,grep -F 'com.a' file
在file
中搜索固定的com.a
文本(awk
使用com.a
正则表达式在每行搜索com.a
子字符串,index($0, "com.a")
版本搜索com.a
作为字面值字符串),sort -u
对输出进行排序并返回唯一值。
awk 'index($0, "com.a") && !seen[$0]++' file
解决方案可能是最好的,一切都在单个awk
中完成,参见在线演示。只有那些包含com.a
子字符串的行才会被打印。
让我给你看看我最喜欢的:
| sort | uniq
当你把这个放在一些列表之后(比如cat filename
),你只得到不同的值,重复的被删除。
我使用它的原因是灵活性:您可以轻松地为排序添加一个标准,如sort -k3 -n
,并且在需要的情况下,您可以计算重复的数量,在uniq
命令中添加-c
,这可能都组合成| sort -k3 -n | uniq -c
,它首先排序您的列表,基于第三列,排序以数字方式完成,然后,重复项被显示和计数。