GREPは最初の11個の値を除外します。

GREPは最初の11個の値を除外します。

フィルタリングが必要な大容量ログファイルがあります。このログには、この文字列を含むすべてのログが表示され、一度だけ表示したいと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

おすすめ記事