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

verwenden könnte
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ß?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top