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