
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