filtrar un archivo de registro por solicitud

filtrar un archivo de registro por solicitud

Intento filtrar mi archivo de registro por solicitud. Quiero filtrar todas las solicitudes (que puedes encontrar en la séptima columna:/userx/index...) que tienen (m=xxx and a=xxx)o (m=xxx and doajax=xxx)solo tienen la solicitud con esos parámetros

Por ejemplo:

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 del 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

Intenté usar este comando para buscar la solicitud que tiene m=xxx y a=xxx pero no sé cómo hacerlo en otro caso (cuando puedo encontrar m=xxx y doajax=xxx) al mismo tiempo.

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

Respuesta1

Qué hay de malo en

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

dónde

  • &&representan lógica y,
  • ||lógico o,
  • split($7,A,"&")dividirá el séptimo campo en una matriz, usando & como separador,
  • $7 = A[1] "&" A[2]cambiar (no en el archivo) campo 7 al subcampo seleccionado
  • printimprimir.

(Esto puede ser de una sola línea, rompo la línea para facilitar la lectura).

esto da

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

Si quieres línea completa con doajax:

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

información relacionada