Awk

按請求過濾日誌文件

  • April 12, 2017

我嘗試按請求過濾我的日誌文件。我想過濾所有具有 (m=xxx and a=xxx)(m=xxx and doajax=xxx)只有具有這些參數的請求的請求(您可以在第 7 列找到:/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=/' 

怎麼了

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

引用自:https://unix.stackexchange.com/questions/358492