Linux Bash Snippet: Einträge in Logfiles zählen und summieren

31. August 2009 von Nico Puhlmann

Heute ein kleines Sysadmin-Helferlein aus der Kategorie Hilfreiche Befehle für Linux, Bash und Co. Hier möchte ich in Zukunft nützliche Kommandos, Einzeiler und Snippets für die tägliche Arbeit mit Linux als Sysadmin posten. Grund-Kenntnisse in Linux über z.B. Pipes usw. sollten vorhanden sein. Viel Spaß!

Oft ist es notwendig aus einem System-Logfile, Daten wie Befehle, Dateinamen, User-Agents, Zeiten oder was auch immer zu zählen, zu summieren und zu sortieren. Möchte man zum Beispiel wissen, welcher Befehl auf einem Webserver am meissten aufgerufen wurde, reicht ein Einzeiler:

cat access_log | awk '{print $6}' | sort | uniq -c | sort -nr | less

Was hier passiert, möchte ich kurz erklären:

cat access_log
Hier öffnen wir die Datei access_log und leiten den Inhalt an den Standard-Output – hier unsere Konsole – zur Ausgabe weiter.

awk '{print $6}'
Mit Awk können wir uns einfach Teile einer Ausgabe aus einem Text herausfiltern. Hier die 6. Stelle – der Befehl. Das Standard-Trennzeichen von awk ist das Leerzeichen, was aus diesem Grund nicht mit angegeben werden muss.

sort
Diese Befehl sortiert die aktuelle Ausgabe.

uniq -c
Hier werden gleich zwei Sachen erledigt. Es werden doppelte Einträge entfernt und gleichzeitig die Anzahl der Vorkommnisse als Prefix vor jede Zeile gesetzt.

sort -nr
Sortiert diese Ausgabe nochmals, jetzt jedoch nach Nummern und rekursiv, so dass der Eintrag mit dem meißten Ergebnissen oben steht.

less
Hier kann wahlweisse auch tail verwendet werden. Sollte klar sein. Less lässt uns die ersten Zeilen in normaler Geschwindigkeit lesen, in dem es die Ausgabe nach vollem Bildschirm anhält.

Die Ausgabe des ganzen Befehles sollte nun ungefähr so aussehen:

528162 "GET
8583 "POST
242 "HEAD
15 "OPTIONS
2 "PUT

Wir können hiermit nun beliebig benötigte Daten zählen und uns schnell einen Überblick über die Anzahl der jeweiligen Vorkommnisse anzeigen lassen. Eine kleine Linux-Live-Statistik sozusagen.

Dir gefällt dieser Beitrag?
Erhalte Updates. Kostenlos.

2 Kommentare

  • Stimmt genau, danke. Der Befehl würde dann so aussehen:

    cat access_log | cut -d ' ' -f 6 | sort | uniq -c | sort -nr | less


    mehr Infos zu cut:

    cut --help


    Danke nochmal an Alex!
  • anstatt awk '{print $6}' kann man auch cut nehmen :)

Was denkst du?