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