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