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

おすすめ記事