usando egrep para encontrar @ ausente no log

1

Estou usando o seguinte comando para encontrar entradas de log que são o resultado de um login no servidor de e-mail:

egrep '_login[^ ]' /var/log/exim_mainlog

Isso funciona bem para encontrar entradas que contenham conteúdo como este:

P=esmtpa A=courier_login:[email protected] S=1573 id=f1cd08396,...

Mas o que eu preciso fazer é alterar minha instrução grep, para que ela encontre logins de uma só palavra que não usam o sinal @, assim:

 P=esmtpa A=courier_login:name S=1573 id=f1cd08396,...

Em que o login anterior era "[email protected]", mas na segunda entrada de log, o login usado era apenas "name".

Isso é possível usando grep ou egrep, talvez em algum tipo de declaração composta?

Muito obrigado.

    
por jols 27.06.2013 / 09:48

2 respostas

2

A expressão regular estendida _login[^ ][^@]+\s deve fazê-lo.

Essa é a string literal _login seguida por um caractere que não é um espaço, seguido por pelo menos um caractere que não é @ , seguido por um caractere de espaço em branco.

    
por l0b0 27.06.2013 / 09:59
0

Se você deseja extrair apenas os nomes de login que não contêm o caractere @, o seguinte comando sed pode ser útil:

echo -e "P=esmtpa A=courier_login:[email protected] S=1573 id=f1cd08396,...\nP=esmtpa A=courier_login:name2 S=1573 id=f1cd08396,..." | \
sed -nr 's/^.*_login:([^ @]+) .*$//p'

A execução deste script resultará na saída abaixo:

name2

Algumas explicações:

  • A primeira linha apenas ecoa 2 linhas de dados de exemplo (separados por um caractere \n de nova linha).

  • A segunda linha contém o comando sed -nr , que neste caso usa a sintaxe s/regexp/replacement/p . Ele ( s ) procura na linha uma expressão regular regexp correspondente ( -r ). Se uma parte da linha for correspondida, o replacement será usado para substituir a parte correspondente. Os comandos -n e p só precisam omitir as linhas que não correspondem ao regexp .

  • sed localiza a string " _login: " em uma linha. Naquela posição:

    • O colchete de abertura marca o início de uma subexpressão. (Considere uma região da linha.)
    • O [^ @]+ corresponde a mais um caractere que não é um espaço nem @. Ele será expandido até que um caractere de espaço seja encontrado.
    • O colchete de fechamento marca o final da subexpressão logo antes desse caractere. A região correspondida é armazenada em uma variável chamada .
  • Se você der uma olhada na parte regexp , ela segue basicamente o padrão ^.*something.*$ . O ^.* corresponde a qualquer caractere no início da linha até a expressão algo . Da mesma forma, o .*$ corresponde a qualquer caractere no final da linha após a expressão algo . A correspondência da linha inteira com o regexp é importante, porque a parte inteira correspondida é substituída.
  • A peça de substituição contém apenas a variável , portanto, o nome de login correspondente será substituído.
por lgarzo 27.06.2013 / 11:07