2008-09-24 21 views
9

Ich habe ein Server-Zugriffsprotokoll, mit Zeitstempeln jeder HTTP-Anfrage, möchte ich eine Anzahl der Anzahl der Anfragen pro Sekunde erhalten. Mit sed und cut -c, bisher habe ich es geschafft, die Datei auf nur die Zeitstempel zu schneiden, wie zum Beispiel:Count Anzahl der Vorkommen von Token in einer Datei

22-September-2008 20:00:21 +0000
22-Sep-2008 20:00:22 +0000
22-Sep-2008 20:00:22 +0000
22-Sep-2008 20:00:22 +0000
22-Sep-2008 20.00.24 0.000
22-Sep-2008 20:00:24 +0000

Was würde ich gerne bekommen, ist die n Umbrella Zeiten erscheint jeder eindeutige Zeitstempel in der Datei. 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 Uhr: 22 +0000: 3
22-Sep-2008 20.00.24 0.000: 2

I sort -u benutzt habe die Liste der Zeitstempel auf eine Liste von eindeutigen Token zu filtern, könnte die Hoffnung, dass ich Verwenden Sie grep wie

grep -c -f <file containing patterns> <file> 

, aber dies erzeugt nur eine einzige Linie von einer Gesamtsumme von übereinstimmenden Linien.

Ich weiß, dass dies in einer einzigen Zeile getan werden kann, ein paar Dienstprogramme aneinanderreihen ... aber ich kann nicht darüber nachdenken. Weiß jemand?

Antwort

32

Ich glaube, du bist für

uniq --count 

-c, --count Präfix Linien durch die Anzahl der Vorkommen

+5

Beachten Sie, dass Sie bei anderen Datensätzen möglicherweise (1) vor uniq (1) sortieren müssen, da uniq nur group adj ace duplicates. –

+0

Ja, aber die OPs haben bereits gesagt, dass er die Dinge sortiert hat, also nahm ich an, dass er oben drauf war ... –

+0

Ich musste 'uniq -c' auf OS X benutzen,' --count' gab mir einen Fehler. –

-2

vielleicht verwenden xargs suchen? Kann nicht alles in meinem Kopf hier auf der Stelle zusammen, aber verwenden Sie xargs auf Ihrem sort -u, so dass Sie für jede einzigartige Sekunde die ursprüngliche Datei grep und einen wc-l machen können, um die Nummer zu erhalten.

1

AWK mit assoziativen Arrays könnte eine andere Lösung für so etwas sein.

1

Nur im Fall, dass Sie die Ausgabe in dem Format, das Sie ursprünglich angegeben (mit der Anzahl der Vorkommen am Ende):

uniq -c logfile | sed 's/\([0-9]+\)\(.*\)/\2: \1/' 
0

awk Verwendung:

cat file.txt | awk '{count[$1 " " $2]++;} \ 
        END {for(w in count){print w ": " count[w]};}' 
0

Tom Lösung:

awk '{count[$1 " " $2]++;} END {for(w in count){print w ": " count[w]};}' file.txt 

funktioniert allgemeiner.

Meine Datei wurde nicht sortiert:

name1 
name2 
name3 
name2 
name2 
name3 
name1 

Daher sind die Vorkommnisse nicht einander folgten, und uniq nicht funktioniert, wie es gibt:

1 name1 
1 name2 
1 name3 
2 name2 
1 name3 
1 name1 

Mit der awk-Skript jedoch:

name1:2 
name2:3 
name3:2 
Verwandte Themen