如何过滤和记录一行的一个实例

如何过滤和记录一行的一个实例

我有一个包含数千行的日志文件。我可以将其过滤到数百行。大多数行都是具有相同信息的重复行,我只想显示这些重复行的一个实例。

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]仅在第一次出现时为真

相关内容