Ich habe eine Apache
Protokolldatei, access.log
wie wird die Anzahl der Zeilen in dieser Datei gezählt? das Ergebnis zum Beispiel 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 gewünschte Ergebnis ist:
3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php
command-line
sort
Kokizzu
quelle
quelle
| sort | uniq -c
| LC_ALL=C sort | LC_ALL=C uniq -c
uniq
das tun könnte ..Antworten:
Wie in den Kommentaren angegeben.
Durch Piping der Ausgabe in
sort
wird die Ausgabe in alphabetischer / numerischer Reihenfolge organisiert.Dies ist eine Anforderung, da
uniq
nur Übereinstimmungen in wiederholten Zeilen, d. HWenn Sie
uniq
diese Textdatei verwenden, wird Folgendes zurückgegeben:Dies liegt daran, dass die beiden
a
durch dasb
- getrennt sind, es handelt sich nicht um aufeinanderfolgende Zeilen. Wenn Sie jedoch zuerst die Daten in alphabetischer Reihenfolge sortieren möchtenDann
uniq
werden die sich wiederholenden Linien entfernt. Die-c
Optionuniq
zählt die Anzahl der Duplikate und liefert die Ausgabe in der Form:Verweise:
sort(1)
uniq(1)
quelle
printf '%s\n' ①.php ②.php | sort | uniq -c
gibt mir2 ①.php
php\nphp
①.php
Sortierung mit der②.php
in meinem Gebietsschema übereinstimmt, da für diese①
und die②
Zeichen in meinem Gebietsschema keine Sortierreihenfolge definiert ist . Wenn Sie eindeutige Werte für Byte-Werte wünschen (Dateipfade müssen nicht unbedingt Text sein), müssen Sie das Gebietsschema auf C: festlegen| LC_ALL=C sort | LC_ALL=C uniq -c
.Die akzeptierte Antwort ist fast vollständig. Möglicherweise möchten Sie
sort -nr
am Ende eine zusätzliche hinzufügen , um die Ergebnisse nach den Zeilen zu sortieren, die zuerst am häufigsten vorkommenuniq optionen:
Sortiermöglichkeiten:
In dem speziellen Fall, in dem die Zeilen, die Sie sortieren, Zahlen sind, müssen Sie
sort -gr
stattdessen verwendensort -nr
(siehe Kommentar)quelle
-n
Option informiert haben .tr ' ' '\n' < $FILE | sort | uniq -c | sort -nr > wordcount.txt
. Der erste Befehl ersetzt Leerzeichen durch Zeilenumbrüche, sodass der Rest des Befehls wie erwartet ausgeführt werden kann.sort -gr
stattdessen, um dieses Problem zu lösen.-g
: Vergleich nach allgemeinem Zahlenwert (statt-n
: Vergleich nach Zahlenwert der Zeichenfolge).-gr
aber ich denke, die Ausgabe vonuniq -c
wird als solchesort -nr
funktionieren, wie beabsichtigt-gr
funktioniert es besser , wenn die Daten Zahlen sind . Probieren Sie diese beiden Beispiele aus, die sich nur in den Flags g und n unterscheiden:echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nr
undecho "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr
. Die erste Sortierung ist falsch, die zweite nicht.Sie können ein assoziatives Array auf awk verwenden und dann -optional- sortieren :
Ausgabe:
quelle