sort -u file.txt entfernt doppelte Zeilen und sortiert den Rest; awk '!seen[$0]++' file.txt entfernt sie und behält die ursprüngliche Reihenfolge. Was Sie brauchen, hängt davon ab, ob die Reihenfolge Bedeutung trägt — in einem Log tut sie das immer. uniq allein leistet weder das eine noch das andere.
1. Warum uniq allein nicht hilft
$ clai entferne doppelte zeilen aus access.log→ uniq access.log10.0.0.710.0.0.310.0.0.710.0.0.910.0.0.310.0.0.710.0.0.1
Die Datei kam unverändert zurück. uniq fasst nur benachbarte gleiche Zeilen zusammen, und in einer echten Datei liegen die Wiederholungen verstreut. Daher das klassische Paar sort | uniq.
2. Duplikate entfernen und sortieren
$ clai entferne duplikate und sortiere die datei→ sort -u access.log10.0.0.110.0.0.310.0.0.710.0.0.9
sort -u erledigt beides in einem Durchgang — kürzer und schneller als die Pipe nach uniq.
3. Duplikate entfernen, Reihenfolge behalten
$ clai entferne duplikate aber behalte die ursprüngliche zeilenreihenfolge→ awk '!seen[$0]++' access.log10.0.0.710.0.0.310.0.0.910.0.0.1
Das ist der echte Unterschied zu sort -u: das erste Vorkommen jeder Zeile bleibt, die Reihenfolge ist unangetastet — wichtig für Logs und alles, was in zeitlicher Folge geschrieben wird. Der Preis ist Speicher: awk hält jede verschiedene Zeile, was bei Dateien im Gigabytebereich auffällt.
4. Wie oft jede Zeile vorkommt
$ clai zähle wie oft jede zeile vorkommt→ sort access.log | uniq -c | sort -rn 3 10.0.0.7 2 10.0.0.3 1 10.0.0.9 1 10.0.0.1
Das "Top-N"-Rezept für Logs. uniq -c zählt, das zweite sort -rn hebt die häufigen nach oben.
5. Nur die Zeilen, die sich wiederholten
$ clai zeige nur zeilen die mehr als einmal vorkommen→ sort access.log | uniq -d10.0.0.310.0.0.7
-d behält nur Duplikate, -u macht das Gegenteil und behält nur Einzelstücke — hier 10.0.0.1 und 10.0.0.9. Praktisch beim Vergleich zweier Listen.
6. Nach einem Feld deduplizieren
$ clai behalte eine zeile pro URL→ awk '!seen[$2]++' req.logGET /a 200GET /b 404
$2 ist das zweite Feld. So faltet man ein Log nach URL, IP oder Session-ID zusammen und behält die erste passende Zeile vollständig.
Gotchas
sort -u datei > dateileert die Datei. Geprüft: die Shell kürzt die Datei zum Schreiben, bevorsortsie überhaupt liest — Ergebnis null Zeilen. Richtig istsort -u datei -o datei: sort hat ein eigenes Flag zum Zurückschreiben, und das funktioniert.uniqbraucht sortierte Eingabe. Ohne vorgeschaltetessortgibt es kommentarlos fast dieselbe Datei zurück. Kein Fehler, nur eine leise falsche Antwort.- Reihenfolge und Sortierung sind zweierlei.
sort -uliefert alphabetische Ordnung,awk '!seen[$0]++'die ursprüngliche. Für Logs wollen Sie fast immer das Zweite, gezeigt wird meist das Erste.
Related questions
Wie finde ich gemeinsame Zeilen zweier Dateien? comm -12 <(sort a.txt) <(sort b.txt). Beide Eingaben müssen sortiert sein, dafür ist die Prozesssubstitution da.
Wie ignoriere ich Groß- und Kleinschreibung? sort -uf vergleicht ohne Rücksicht darauf, awk '!seen[tolower($0)]++' genauso, nur mit erhaltener Reihenfolge.
Und wenn die Datei nicht in den Speicher passt? sort -u lagert auf temporäre Dateien aus und verkraftet Eingaben größer als der Arbeitsspeicher; die awk-Variante kann bei derselben Datei den Speicher sprengen.
See also
- CSV-Spalten mit awk herausziehen
- Suchen und Ersetzen über alle Dateien
- Dateien im Verzeichnis zählen — rekursiv und nach Typ
CliAI wählt anhand Ihrer Formulierung zwischen sortierender und reihenfolgetreuer Variante und zeigt den Befehl vorher an. In einer Zeile installieren.