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

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

awk '$7 ~ /m=/' logfile | awk '$7 ~ /&a=/' 
0
12.04.2017, 12:01
1 ответ

что не так с

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

, где

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

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

это дает

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 ;}'
0
28.01.2020, 04:47

Теги

Похожие вопросы