リクエストによるログファイルのフィルタリング

リクエストによるログファイルのフィルタリング

要求に応じてログファイルをフィルタリングしようとしています。すべてのリクエストをフィルタリングする(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=/' 

答え1

何が問題なの?

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

どこ

  • &&論理和を表し、
  • ||論理OR、
  • split($7,A,"&")&を区切り文字として7番目のフィールドを配列に分割します。
  • $7 = A[1] "&" A[2]フィールド7(ファイルにはありません)を選択したサブフィールドに変更
  • print印刷。

(これは1つ減らすことができます。読みやすさのために分割されました)。

これは

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

関連情報