Sed e duas linhas consecutivas

1

Eu tenho um arquivo de log de um aplicativo e devo filtrar apenas os usuários que não fizeram logon com sucesso (que é registrado como ok logo após o ID do usuário)

O arquivo de log tem entradas como segue.

user2
user5
user7
user1
user1
user1 ok
user8
user9
user3
user3 ok

A saída esperada deve ser a seguinte.

user2
user5
user7
user8
user9

Estou tentando:

sed "/user/N;/ok/d"

Nenhum resultado. Eu continuo recebendo "usuário 1"

user2
user5
user7
user1
user8
user9
    
por skldfh 13.02.2017 / 18:36

1 resposta

3

Isso funciona, a menos que eu tenha entendido sua pergunta de maneira errada:

$ grep -v -f <(grep " ok$" aa.txt |cut -d' ' -f1) aa.txt
user2
user5
user7
user8
user9

Na realidade, usamos grep para todos os nomes marcados como ok, e usamos esses nomes como um padrão a ser excluído do mesmo arquivo para obter logins "não ok".

Isso é baseado no fato de que, como o user1 tinha no final um login bem-sucedido (mesmo depois de três tentativas), user1 não é considerado uma falha, portanto, todas as tentativas do usuário1 são excluídas. grep -v: excluir padrão
grep -f: carrega padrões do arquivo, aqui uma substituição de processo que contém os logins bem-sucedidos.

PS1: o arquivo aa.txt é um dos meus arquivos locais nos quais colei seus dados.

Atualização:
Usar <(grep " ok$" aa.txt |cut ...) com um espaço antes de ok garantirá que os nomes de usuários que falharam no login, mas incluam "ok" em seus nomes, não serão correspondidos (por exemplo, usuário Bangok)

    
por 13.02.2017 / 21:15

Tags