filtra um arquivo de log por solicitação

0

Eu tento filtrar meu arquivo de log por solicitação. Quero filtrar toda a solicitação (que você pode encontrar na 7a coluna: / userx / index ...) que tem (m=xxx and a=xxx) ou (m=xxx and doajax=xxx) e só tem a solicitação com esses parâmetros

Por exemplo:

192.xx.x.x - - [11/Apr/2017:09:59:xx +0200] "POST /userx/index.php?m=xxxx&doajax=xxxx&action=xxxxx&id=x
192.xx.x.x - - [11/Apr/2017:09:59:xx +0200] "POST /userx/index.php?detailed=1&id=amgervais
192.xx.x.x - - [11/Apr/2017:09:59:xx +0200] "POST /userx/index.php?m=xxx&a=xxxx&dialog=x&actionId=x&prospectId=xx

resultado do filtro:

192.xx.x.x - - [11/Apr/2017:09:59:xx +0200] "POST /userx/index.php?m=xxxx&doajax=xxxx&action=xxxxx
192.xx.x.x - - [11/Apr/2017:09:59:xx +0200] "POST /userx/index.php?m=xxx&a=xxxx

Eu tentei usar este comando para procurar o pedido que tem m = xxx e a = xxx, mas eu não sei como fazer para outro caso (quando eu posso encontrar m = xxx e doajax = xxx) ao mesmo tempo.

awk '$7 ~ /m=/' logfile | awk '$7 ~ /&a=/' 
    
por Sara Quispe 12.04.2017 / 10:13

1 resposta

0

o que há de errado com

awk '( $7 ~ /m=xxx/ ) && (( $7 ~ /a=xxx ) || ( $7 ~ /doajax=xxx/ )) {
    split($7,A,"&") ; $7 = A[1] "&" A[2] ;print ;} ' logfile

onde

  • && significa lógica e
  • || logical ou,
  • split($7,A,"&") dividirá o 7º campo em array, usando & como separador,
  • $7 = A[1] "&" A[2] alteração (não no arquivo) 7º campo para o subcampo selecionado
  • print print.

(isso pode ser um alinhado, eu rompi a linha para legibilidade).

isto dá

192.xx.x.x - - [11/Apr/2017:09:59:xx +0200] "POST /userx/index.php?m=xxxx&doajax=xxxx
192.xx.x.x - - [11/Apr/2017:09:59:xx +0200] "POST /userx/index.php?m=xxx&a=xxxx

Se você quiser uma linha completa com doajax :

 awk '/doajax/ { print ; next ; } 
 ( $7 ~ /m=xxx/ )  && ( $7 ~ /a=xxx/ ) { split($7,A,"&") ; $7 = A[1] "&" A[2] ;print ;}'
    
por 12.04.2017 / 11:04

Tags