ファイルがあります。 filename.logと呼びます。以下の内容があります。
(2014-11-18 14:09:21,766), , xxxxxx.local, EventSystem, DEBUG FtpsFile delay secs is 5 [pool-3-thread-7]
(2014-11-18 14:09:21,781), , xxxxxx.local, EventSystem, DEBUG FtpsFile disconnected from ftp server [pool-3-thread-7]
(2014-11-18 14:09:21,798), , xxxxxx.local, EventSystem, DEBUG FtpsFile FTP File Process@serverStatus on exit - 113 [pool-3-thread-7]
(2014-11-18 14:09:21,798), , xxxxxx.local, EventSystem, DEBUG FtpsFile FTP File Process@serverStatus on exit - 114 [pool-3-thread-7]
(2014-11-18 14:09:21,799), , xxxxxx.local, EventSystem, DEBUG JobQueue $_Runnable Finally of consume() :: [pool-3-thread-7]
最も頻繁にデバッグメッセージを生成するクラスを見つけようとします。
この例では、以下を見ることができます。FTPSファイルそしてジョブキューメッセージを生成する2つのクラス。
私はこれを持っています
cat filename.log | sed -n -e 's/^.*\(DEBUG \)/\1/p' | sort | uniq -c | sort -rn | head -10
これによりクラス名が生成され、最も一般的なクラス(上位10個)が表示されます。
問題は、これがクラスの規模を教えてくれないことです。FTPSファイル4です。各FtpsFileログファイルを異なる一意のエンティティとして扱います。
デフォルトでは、DEBUGの後の最初の単語をつかみ、残りの数を無視するように上記のコマンドをどのように変更しますか?
理想的には、4 FtpsFile 1 JobQueueを取得する必要があります。
ベストアンサー1
GNUの使用
sed
:sed 's/.*DEBUG \(\w*\).*/\1/' | uniq -c 4 FtpsFile 1 JobQueue
そして
grep
:grep -Po 'DEBUG \K\w+' | uniq -c 4 FtpsFile 1 JobQueue
そして
awk
:awk '$6=="DEBUG"{print $7}' | uniq -c 4 FtpsFile 1 JobQueue
最後はpureで行うことができますが、awk
類似性のためにパイプしますuniq
。