Count Anzahl der Vorkommen von Token in einer Datei
Frage
Ich habe einen Server-Zugriffsprotokoll, mit Zeitstempel jeder HTTP-Anforderung, würde Ich mag eine Zählung der Anzahl der Anfragen an jedem zweiten zu erhalten. Mit sed
und cut -c
, bisher habe ich es geschafft, die Datei auf nur die Zeitstempel schneiden, wie zum Beispiel:
22-Sep-2008 20.00.21 0.000
22-Sep-2008 20.00.22 0.000
22-Sep-2008 20.00.22 0.000
22-Sep-2008 20.00.22 0.000
22-Sep-2008 20.00.24 0.000
22-Sep-2008 20.00.24 0.000
Was ich liebe, ist die Anzahl der in der Datei jeder eindeutigen Zeitstempel angezeigt zu bekommen. Zum Beispiel mit dem obigen Beispiel würde Ich mag Ausgabe erhalten, die wie folgt aussieht:
22-Sep-2008 20.00.21 0.000: 1 | 22-Sep-2008 20.00.22 0.000: 3
22-Sep-2008 20.00.24 0.000: 2
Ich habe sort -u
verwendet, um die Liste der Zeitstempel auf eine Liste von eindeutigen Token zu filtern, in der Hoffnung, dass ich grep wie
grep -c -f <file containing patterns> <file>
, aber das erzeugt nur eine einzige Zeile einer Gesamtsumme von Anpassungsleitungen.
Ich weiß, dass dies in einer einzigen Zeile durchgeführt werden kann, ein paar Dienstprogramme zusammen Bespannen ... aber ich kann davon nicht denken. Wer weiß?
Lösung
Ich glaube, Sie suchen
uniq --count
-c, --count Präfix Linien durch die Anzahl der Vorkommen
Andere Tipps
Mit AWK mit assoziativer Arrays könnte eine andere Lösung zu so etwas wie diese.
Für den Fall, Sie die Ausgabe im Format mögen Sie ursprünglich angegeben (mit der Anzahl der Vorkommen am Ende):
uniq -c logfile | sed 's/\([0-9]+\)\(.*\)/\2: \1/'
Mit awk :
cat file.txt | awk '{count[$1 " " $2]++;} \
END {for(w in count){print w ": " count[w]};}'
Tom Lösung:
awk '{count[$1 " " $2]++;} END {for(w in count){print w ": " count[w]};}' file.txt
funktioniert im Allgemeinen.
Meine Datei wurde nicht sortiert:
name1
name2
name3
name2
name2
name3
name1
Daher sind die Vorkommen wurden einander nicht folgen, und uniq
funktioniert nicht wie es gibt:
1 name1
1 name2
1 name3
2 name2
1 name3
1 name1
Mit dem awk-Skript jedoch:
name1:2
name2:3
name3:2
vielleicht verwenden xargs? Kann es nicht alle zusammen in meinem Kopf hier auf der Stelle setzen, aber xargs auf Ihrer Art verwenden -u, so dass für jede einzelne Sekunde Sie die Originaldatei grep tun können und die Zahl ein wc -l zu erhalten.