Analysieren von Protokolldateien mit sed -e. Eindeutige Klassennamen müssen gezählt werden

Analysieren von Protokolldateien mit sed -e. Eindeutige Klassennamen müssen gezählt werden

Ich habe eine Datei, nennen wir sie Dateiname.log, darin habe ich so etwas

(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] 

Ich versuche, die Klassen zu finden, die die häufigsten DEBUG-Meldungen erzeugen.

In diesem Beispiel sehen SieFTP-DateiUndJobQueuesind zwei der Klassen, die eine Nachricht erzeugen.

ich habe das

cat filename.log | sed -n -e 's/^.*\(DEBUG \)/\1/p' | sort | uniq -c | sort -rn | head -10

Dadurch werden die Klassennamen ausgegeben und mir die am häufigsten vorkommenden Klassen als Top 10 angezeigt.

Das Problem ist, dass ich dadurch nicht die Anzahl der Klassen erhalte.FTP-Dateials 4. Es zählt jede FtpsFile-Protokolldatei als eine andere, eindeutige Einheit.

Wie ändere ich den obigen Befehl, sodass er im Wesentlichen besagt, dass ich das erste Wort nach DEBUG erfasse und den Rest für meine Zählung ignoriere?

Idealerweise sollte ich 4 FtpsFile 1 JobQueue bekommen

Antwort1

  • Mit GNU sed:

    sed 's/.*DEBUG \(\w*\).*/\1/' | uniq -c
          4 FtpsFile
          1 JobQueue
    
  • Mit grep:

    grep -Po 'DEBUG \K\w+' | uniq -c
          4 FtpsFile
          1 JobQueue
    
  • Mit awk:

    awk '$6=="DEBUG"{print $7}' | uniq -c
          4 FtpsFile
          1 JobQueue
    

Letzteres kann in reinem durchgeführt werden awk, aber der Ähnlichkeit halber habe ich es an weitergeleitet uniq.

Antwort2

Schnelle Lösung – ich habe den folgenden Ausschneidebefehl hinzugefügt, um dieses Feld hervorzuheben:

[host:~]$ cat logfile | cut -d" " -f7 | sort | uniq -c | sort -rn | head -10
      4 FtpsFile
      1 JobQueue

In meinem Eifer, KISS zu verwenden, gilt dies nicht für Klassen mit einem Leerzeichen im Namen.

Antwort3

Sie können awk (anstelle von sed) verwenden, um die Anzeige von Feldern vor dem für Sie interessanten Feld zu vermeiden, und dann den Abschnitt ausschneiden, den Sie anzeigen möchten:

[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

(Hinweis: Sie haben auch zweimal sortiert, was unnötig erscheint)

EDIT: Wenn Sie nicht wissen, wie lange die Kurse dauern werden, können Sie (anstelle von „cut“) einen zusätzlichen awk-Befehl hinzufügen:

[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

verwandte Informationen