たとえば、機能別にログファイルをフィルタリングしたいとします。
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/d
P
答え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
ページをご覧ください。