ファイルがあります。 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
。
答え2
クイック修正 - フィールドを選択するために、次の切り取りコマンドを追加しました。
[host:~]$ cat logfile | cut -d" " -f7 | sort | uniq -c | sort -rn | head -10
4 FtpsFile
1 JobQueue
KISSへの私の欲望のため、名前にスペースがあるクラスでは機能しません。
答え3
sedの代わりにawkを使用すると、興味のあるフィールドの前のフィールドを見ずに見たい部分を切り取ることができます。
[hunter@apollo: ~]$ cat filename.log | awk -F, '{ print $6 }' | cut -c 1-15 | uniq -c | sort -rn | head -10
4 DEBUG FtpsFile
1 DEBUG JobQueue
(注:2回ソートしましたが、これは不要に見えます)
編集:クラスがどのくらい持続するかわからない場合(cutの代わりに)、追加のawkコマンドを追加できます。
[hunter@apollo: ~]$ cat filename.log | awk -F, '{ print $6 }' | awk '{ print $1, $2 }' | uniq -c | sort -rn | head -10
4 DEBUG FtpsFile
1 DEBUG JobQueue