Como filtrar e registrar uma instância de uma linha

1

Eu tenho um arquivo de log com milhares de linhas. Eu posso filtrar para várias centenas de linhas. A maioria das linhas são repetidas com as mesmas informações e eu gostaria que apenas uma instância dessas linhas repetidas fosse exibida.

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

Como obtenho somente esta saída:

hostA plugin time out
hostB plugin time out
hostC plugin time out
    
por allegory 21.10.2017 / 03:26

2 respostas

1

Adicionar pipe ao uniq

cat file.log | grep "plugin time out" |uniq
    
por 21.10.2017 / 03:49
1

Alguns comentários e sugestões

  • Evite Uso inútil do gato . Muitos comandos podem aceitar diretamente o nome do arquivo como entrada e, se não, use a reorientação. Por ex: tr 'a-z' 'A-Z' < ip.txt ou < ip.txt tr 'a-z' 'A-Z'
  • Use aspas simples para evitar a interpretação de shell. Veja mywiki.wooledge - Citações


solução usando awk

$ awk '/plugin time out/ && !seen[$1]++' file.log
hostA plugin time out
hostB plugin time out
hostC plugin time out
  • /plugin time out/ é como grep de uso. Filtrar linhas correspondentes a plugin time out
  • !seen[$1]++ para filtrar somente linhas exclusivas com base na primeira coluna de tais linhas (por padrão awk divide linhas de entrada em espaços em branco e os campos são acessíveis por $1 , $2 , etc)
    • seen é array associativo com o primeiro campo como chaves. O valor padrão no contexto numérico é 0 . Então, !seen[$1] será verdadeiro apenas para a primeira ocorrência
por 21.10.2017 / 07:22