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 seleccionadoprint
imprimir.
(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 ;}'