фильтровать файл журнала по запросу

фильтровать файл журнала по запросу

Я пытаюсь отфильтровать свой файл журнала по запросу. Я хочу отфильтровать все запросы (которые вы можете найти в 7-м столбце: /userx/index...), которые имеют (m=xxx and a=xxx)или (m=xxx and doajax=xxx)и только имеют запрос с этими параметрами

Например:

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

результат фильтра:

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

Я пытался использовать эту команду, чтобы найти запрос, в котором m=xxx и a=xxx, но не знаю, как это сделать в другом случае (когда я могу найти m=xxx и doajax=xxx) одновременно.

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

решение1

Что случилось с

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

где

  • &&обозначают логическое и,
  • ||логическое или,
  • split($7,A,"&")разделит 7-е поле на массив, используя & в качестве разделителя,
  • $7 = A[1] "&" A[2]изменить (нет в файле) 7-е поле на выбранное подполе
  • printРаспечатать.

(это может быть одна строка, я разбиваю строки для удобства чтения).

это дает

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

Если вам нужна полная строка с doajax:

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

Связанный контент