parse log vsftpd com script de shell

0

Eu tento analisar essa linha com vsftpd:

Sun Apr 7 07:23:33 2013 [pid 23590] [cam02430] OK UPLOAD: Client "206.132.183.209", "/20130407/07/20130407_072324D.avi", 496846 bytes, 383.38Kbyte/sec

com:

cut -d" " -f9 | sed 's/\[\(.*\)\]//'

Isso analisa o nome de usuário com sucesso, que é: cam02430

Mas agora a data mudou:

Wed Apr 10 10:37:50 2013 [pid 26137] [cam02299] OK UPLOAD: Client "206.132.183.201", "/20130410/10/20130410_103802D.avi", 496838 bytes, 363.67Kbyte/sec

Agora, para analisar isso, preciso usar:

cut -d" " -f8 | sed 's/\[\(.*\)\]//'

Existe uma maneira melhor de analisar o nome de usuário em uma linha? Eu gostaria de ficar com um script de shell.

    
por Tom 10.04.2013 / 17:01

1 resposta

1

Meu primeiro instinto é isolar a parte do usuário (usando grep -o ). A coisa boa sobre isso é que tem alguma marcação (relativamente) única - os colchetes.

Assim, o grep abaixo isola os (dois) campos que possuem colchetes ao redor deles, então retira o primeiro campo (ID do processo) e retira o colchete do que resta (campo do usuário)

 < vsftp.log grep -o '\[[^]]*\] *\[[^]]*\]' | sed -e 's/\[[^]]*\] *//' -e 's/\[\(.*\)\]//'

Se você puder garantir que não haja espaços no nome do usuário, poderá aproveitar e simplificar um pouco as coisas. Encontre o campo entre colchetes sem espaços (o campo pid teria eles) e então faça o corte.

< vsftp.log grep -o '\[[^] ]*\]' | sed -e 's/\[\(.*\)\]//'

Funciona, mas pode não ser o ideal.

    
por 10.04.2013 / 17:40