sed -e を使用してログファイルを解析します。一意のクラス名を計算する必要があります。

sed -e を使用してログファイルを解析します。一意のクラス名を計算する必要があります。

ファイルがあります。 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

関連情報