フィルタリングが必要な大容量ログファイルがあります。このログには、この文字列を含むすべてのログが表示され、一度だけ表示したいとdns
思います。
今すぐ:
Dec 9 07:24:02 94.15.218.140 syslog: ssk:548.049:is_dns_hijack:1451:isDnsHijack=0
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.217:cmsLck_acquireLockWithTimeoutTraced:98:acquired lock. callerFuncName is_dns_hijack; timeout 12000 milliseconds
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.218:cmsLck_releaseLockTraced:144:lock hold time=0ms, acquiring lock callerFuncName is_dns_hijack; releasing lock callerFuncName is_dns_hijack;
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.225:is_dns_hijack:1425:isDnsHijack=0
Dec 9 07:24:17 94.15.218.140 syslog: ssk:563.048:cmsLck_acquireLockWithTimeoutTraced:95:acquired lock. callerFuncName is_dns_hijack; timeout 12000 milliseconds
Dec 9 07:24:17 94.15.218.140 syslog: ssk:563.048:cmsLck_releaseLockTraced:141:lock hold time=0ms, acquiring lock callerFuncName is_dns_hijack; releasing lock callerFuncName is_dns_hijack;
Dec 9 07:24:17 94.15.218.140 syslog: ssk:563.049:is_dns_hijack:1451:isDnsHijack=0
これに関して:
Dec 9 07:24:02 94.15.218.140 syslog: ssk:548.049:is_dns_hijack:1451:isDnsHijack=0
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.217:cmsLck_acquireLockWithTimeoutTraced:98:acquired lock. callerFuncName is_dns_hijack; timeout 12000 milliseconds
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.218:cmsLck_releaseLockTraced:144:lock hold time=0ms, acquiring lock callerFuncName is_dns_hijack; releasing lock callerFuncName is_dns_hijack;
デフォルトでは、タイムスタンプが異なるため、同じログが複数回繰り返されます。
を使用しようとしましたが、uniq
それを行うには、3番目の列のタイムスタンプを削除する必要があります(で実行可能 awk '{ $3=""; print }'
)。ただし、ログに示すように、最初の11文字が異なります(例:ssk:563.048
- ssk:563.049
)。私はgrep
単語の操作を行いdns
、最初の11個の値を無視しようとしています。
どうすればいいですか?もっと良い方法がありますか?
答え1
フィールド区切り記号としてawk
およびを使用します。:
その後、各固有のエラーメッセージ(6番目のフィールド)を配列に保存し、最初の発生のみを印刷できます。
$ awk -F: '!a[$6]++' file
Dec 9 07:24:02 94.15.218.140 syslog: ssk:548.049:is_dns_hijack:1451:isDnsHijack=0
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.218:cmsLck_releaseLockTraced:144:lock hold time=0ms, acquiring lock callerFuncName is_dns_hijack; releasing lock callerFuncName is_dns_hijack;
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.217:cmsLck_acquireLockWithTimeoutTraced:98:acquired lock. callerFuncName is_dns_hijack; timeout 12000 milliseconds
a
上記のスクリプトは、6番目のフィールド()の値が保存されていない場合にのみ、各行を連想配列のエントリとして保存します!a[$6]
。デフォルトのジョブは、awk
一部の結果がtrueのときに印刷することであるため、これは最初に発生した一意の項目のみを印刷します。
一致する行に対してのみこれを行うには、次のようにdns
します。
awk -F: '!a[$6]++ && /dns/' file
11行目を無視する場合は、次のようにできます。
grep dns file | tail -n +12