filtrar um arquivo de log por solicitação

filtrar um arquivo de log por solicitação

Tento filtrar meu arquivo de log por solicitação. Quero filtrar todas as solicitações (que você encontra na 7ª coluna:/userx/index...) que possuem (m=xxx and a=xxx)ou (m=xxx and doajax=xxx)e somente possuem 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

Tentei usar este comando para procurar a solicitação que tem m=xxx e a=xxx mas não sei como fazer para outro caso (quando consigo encontrar m=xxx e doajax=xxx) ao mesmo tempo.

awk '$7 ~ /m=/' logfile | awk '$7 ~ /&a=/' 

Responder1

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ógico e,
  • ||lógico ou,
  • split($7,A,"&")irá dividir o 7º campo em array, usando & como separador,
  • $7 = A[1] "&" A[2]alterar (não no arquivo) o 7º campo para o subcampo selecionado
  • printimprimir.

(pode ser uma linha, quebro a linha para facilitar a leitura).

isso 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 linha completa com doajax:

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

informação relacionada