リクエストに応じてログファイルをフィルタリングする

リクエストに応じてログファイルをフィルタリングする

(m=xxx and a=xxx)ログファイルをリクエストでフィルタリングしようとしています。または を持つすべてのリクエスト(7番目の列:/userx/index ...で見つけることができます)をフィルタリングし、 (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印刷します。

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

関連情報