我有一个包含数千行的日志文件。我可以将其过滤到数百行。大多数行都是具有相同信息的重复行,我只想显示这些重复行的一个实例。
cat file.log | grep "plugin time out"
hostA plugin time out
hostA plugin time out
hostA plugin time out
hostB plugin time out
hostB plugin time out
hostC plugin time out
我如何只得到这个输出:
hostA plugin time out
hostB plugin time out
hostC plugin time out
答案1
将管道添加到 uniq
cat file.log | grep "plugin time out" |uniq
答案2
一些意见和建议
- 避免猫的无用用途。许多命令可以直接接受文件名作为输入,如果不接受,则使用重定向。例如:
tr 'a-z' 'A-Z' < ip.txt
或< ip.txt tr 'a-z' 'A-Z'
- 使用单引号以避免 shell 解释。看mywiki.wooledge - 行情
解决方案使用awk
$ awk '/plugin time out/ && !seen[$1]++' file.log
hostA plugin time out
hostB plugin time out
hostC plugin time out
/plugin time out/
就像grep
用法一样。过滤线匹配plugin time out
!seen[$1]++
根据此类行的第一列仅过滤唯一行(默认情况下,awk
在空格上分割输入行,并且可以通过$1
、$2
等访问字段)seen
是以第一个字段作为键的关联数组。数字上下文中的默认值为0
。所以!seen[$1]
仅在第一次出现时为真