Estou tentando pesquisar um arquivo de log em busca de atividades registradas que não foram concluídas. Por exemplo, registro uma "Atividade inicial para o ID 1234 ..." e, se for bem-sucedida, a próxima linha será "Atividade 1234 concluída".
Estou tentando obter as linhas "Iniciando ..." que NÃO são seguidas pelas linhas "Concluídas" correspondentes.
Arquivo de log de exemplo
Starting activity for ID 1234
ID 1234 completed successfully
Starting activity for ID 3423
ID 3423 completed successfully
Starting activity for ID 9876
ID 9876 completed successfully
Starting activity for ID 99889
ID 99889 completed successfully
Starting activity for ID 10011
ID 10011 completed successfully
Starting activity for ID 33367
Starting activity for ID 936819
ID 936819 completed successfully
Neste exemplo, eu estaria procurando pela saída:
Starting activity for ID 33367
... porque não é seguido por uma linha "concluída".
Eu tentei fazer isso com grep
e awk
, mas não tive muito sucesso. Suponho que isso possa ser feito com uma dessas ferramentas, mas as minhas grep
e as awk
costeletas não são avançadas.
Olhando para uma rápida e confiável grep
ou awk
padrão para dar os resultados que eu preciso aqui.
Respostas:
Aqui está uma
awk
alternativa:Resultado:
A
I
matriz associativa controla quais IDs foram vistos.fonte
I[$5] = 1
, você pode apenas usarI[$5]
. (Você não se importa com o valor, você apenas quer que o elemento exista , e simplesmente nomeá-lo para fazer isso.) #Isso excluirá da saída todas as linhas de entrada que não forem seguidas por uma linha correspondente à sequência concluída .
fonte
Veja como você pode fazer isso com o GNU sed:
N
lê mais uma linha no espaço do padrão.d
) e o ciclo é reiniciado.P
) e exclua-a (D
).fonte
-r
não é necessário, certo?+
quantificador.se sua instalação suportar pcregrep, a opção multilinha (-M) será útil.
Iniciando atividade para ID 33367
fonte