it-swarm.com.de

Sortieren und zählen Sie die Häufigkeit des Auftretens von Zeilen

Ich habe Apache Logdatei, access.log, wie zählt die Anzahl der Zeilen in dieser Datei? zum Beispiel das Ergebnis von cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]' ist

a.php
b.php
a.php
c.php
d.php
b.php
a.php

das Ergebnis, das ich möchte, ist:

3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php 
169
Kokizzu
| sort | uniq -c

Wie in den Kommentaren angegeben.

Durch Weiterleiten der Ausgabe in sort wird die Ausgabe in alphabetischer/numerischer Reihenfolge organisiert.

Dies ist eine Voraussetzung, da uniq nur in wiederholten Zeilen übereinstimmt, d. H.

a
b
a

Wenn Sie uniq für diese Textdatei verwenden, wird Folgendes zurückgegeben:

a
b
a

Dies liegt daran, dass die beiden a durch die b getrennt sind - es handelt sich nicht um aufeinanderfolgende Zeilen. Wenn Sie die Daten jedoch zuerst in alphabetischer Reihenfolge sortieren, wie zuerst

a
a
b

Dann entfernt uniq die sich wiederholenden Zeilen. Die Option -c Von uniq zählt die Anzahl der Duplikate und liefert die Ausgabe in der Form:

2 a
1 b

Verweise:

233
visudo
[your command] | sort | uniq -c | sort -nr

Die akzeptierte Antwort ist fast vollständig. Möglicherweise möchten Sie am Ende ein zusätzliches sort -nr Hinzufügen, um die Ergebnisse mit den Zeilen zu sortieren, die am häufigsten zuerst auftreten

uniq Optionen:

-c, --count
       prefix lines by the number of occurrences

Sortieroptionen :

-n, --numeric-sort
       compare according to string numerical value
-r, --reverse
       reverse the result of comparisons

In dem speziellen Fall, in dem die Zeilen, die Sie sortieren, Zahlen sind, müssen Sie sort -gr Anstelle von sort -nr Verwenden, siehe Kommentar

131

Sie können ein assoziatives Array für awk und dann -optional- sort verwenden:

$ awk ' { tot[$0]++ } END { for (i in tot) print tot[i],i } ' access.log | sort

ausgabe:

1 c.php
1 d.php
2 b.php
3 a.php
12