按请求过滤日志文件

按请求过滤日志文件

我尝试按请求过滤我的日志文件。我想过滤所有具有 (m=xxx and a=xxx)(m=xxx and doajax=xxx)仅具有带有这些参数的请求的请求(您可以在第七列中找到:/userx/index...)

例如:

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 ;}'

相关内容