Marco Ceppi hat Recht awk
, ein besseres Werkzeug dafür zu sein, aber awk ist auch ein besseres Werkzeug als sort
und uniq
seitdem kann diese Logik verwendet werden awk
. Es macht keinen großen Unterschied, wenn Sie nur 1000 Zeilen nachverfolgen, aber wenn Sie sich eine riesige Multi-Gig-Protokolldatei ansehen möchten, ist es möglicherweise um Größenordnungen schneller, diese zu verschieben awk
.
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
wird tun, was Sie brauchen, ist aber viel schneller für große Dateien. Es erstellt ein Array von IPs in awk, wobei die IP-Adresse als Schlüssel und die Häufigkeit, mit der die IPs auftreten, als Wert verwendet werden.
Die Geschwindigkeit steigt, weil awk die Daten überschreitet und den größten Teil der Arbeit erledigt, mit Ausnahme des Sortierens der endgültigen Ausgabe. Wenn Sie mit der anderen Methode 1.000.000 Zeilen im Übertragungsprotokoll haben, liest awk diese 1.000.000 Zeilen, die 1.000.000 IPs ausspucken, und sortiert dann die gesamten 1.000.000 IPs und sendet die jetzt sortierten 1.000.000 IPs an uniq Datenmenge, bevor Sie diese sortieren. Anstatt mehrere Durchläufe auf 1.000.000 IPs durchzuführen, erledigt awk fast alles in einem Durchgang.
Mit einem 5.513.132-Zeilen-Apache-Protokoll (1,1 GB) auf meinem Laptop ist hier ein Geschwindigkeitsvergleich:
- 2m 45s
cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
- 0m 40s
cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n