ログファイルをフィルタリングする

ログファイルをフィルタリングする

ログ ファイルを機能別にフィルター処理してみました。例:

195.xx.x.x - - [13/Apr/2017:09:60:xx +0200] "POST /userx/index.php?m=contacts&xxxx...
192.xx.x.x - - [13/Apr/2017:09:45:xx +0200] "POST /userx/index.php?m=customer&xxxx...
197.xx.x.x - - [13/Apr/2017:09:10:xx +0200] "POST /userx/index.php?m=meeting&xxxx...
197.xx.x.x - - [13/Apr/2017:09:20:xx +0200] "POST /userx/index.php?m=dashboard&xxxx...

この場合、私の機能は連絡先、顧客、会議、ダッシュボードです。デフォルトのウェルカムページは無視するようにしています。

awk '$7 !~ /m=dashboard/ ' log file

私の質問は、ファイル内の他の機能も無視できるかどうかです。

cat file:
dashboard
meeting

次の行だけを持つようにします:

195.xx.x.x - - [13/Apr/2017:09:60:xx +0200] "POST /userx/index.php?m=contacts
192.xx.x.x - - [13/Apr/2017:09:45:xx +0200] "POST /userx/index.php?m=customer

答え1

sed '/\//!{H;d};G;/m=\(.*\)\n.*\1/d;P;d' file log

説明: 最初にfileフィルター キーワードで読み取り、次にログ ファイルを読み取ります。no を含む行は/キーワードとして解釈され、ホールド スペース ( H) に追加されます。その他の行にはホールド スペース ( ) が追加され、 の後のキーワードがキーワード リスト ( ) 内で繰り返されているG場合は削除されます。そうでない場合は、追加されたホールド スペース ( )なしで印刷されます。m=/m=\(.*\)\n.*\1/dP

答え2

あなたの質問がより意味を成すようになったように思われるので、あなたが探しているのは次のようなものだと思います:

awk -F= 'NR==FNR{l[$NF]=1; next} { if (!l[$NF]) print;}' ignore_words your_log_file

編集

Sundeep が上記のコメントで指摘したように、grep を次のように使用できます。

grep -Fvf ignore_words log_file

オプション-Fvfの用途については、man grepページを参照してください。

関連情報