Der Befehl uniq filtert oder zählt aufeinanderfolgende doppelte Zeilen in einer Eingabe. Er ist ein klassisches Coreutils-Werkzeug für Log-Analysen, Wordcounts und das Aufspüren von Duplikaten — nahezu immer in Kombination mit sort, denn uniq erkennt nur direkt benachbarte Wiederholungen.
Was uniq macht
uniq liest seine Eingabe zeilenweise und vergleicht jede Zeile nur mit der unmittelbar vorhergehenden. Wiederholungen werden dabei zu einer einzelnen Zeile zusammengefasst. Das hat eine wichtige Konsequenz: Tritt dieselbe Zeile zweimal auf, aber durch andere Zeilen getrennt, sieht uniq keine Duplikate.
printf "apfel\nbirne\napfel\n" | uniqapfel
birne
apfelErst durch vorheriges Sortieren landen Duplikate nebeneinander, und uniq kann sie zusammenfassen. Daraus ergibt sich das klassische Shell-Idiom sort | uniq.
printf "apfel\nbirne\napfel\n" | sort | uniqapfel
birneOptionen
| Option | Wirkung |
|---|---|
-c, --count | Stellt jeder Zeile die Anzahl ihrer Vorkommen voran |
-d, --repeated | Gibt nur Zeilen aus, die mehrfach vorkommen — pro Gruppe einmal |
-D, --all-repeated | Gibt alle Vorkommen von Duplikatgruppen aus (nicht reduziert) |
-u, --unique | Gibt nur Zeilen aus, die genau einmal vorkommen |
-i, --ignore-case | Vergleicht case-insensitive |
-f N, --skip-fields=N | Ignoriert die ersten N Felder beim Vergleich |
-s N, --skip-chars=N | Ignoriert die ersten N Zeichen beim Vergleich |
-w N, --check-chars=N | Vergleicht nur die ersten N Zeichen jeder Zeile |
-z, --zero-terminated | Verwendet NUL statt Zeilenumbruch als Zeilentrenner |
Felder werden dabei standardmäßig durch Whitespace getrennt; -f springt zuerst, -s danach.
Idiom sort | uniq -c | sort -rn | head
Eines der nützlichsten Shell-Idiome überhaupt: aus einer beliebigen Liste die häufigsten Einträge ermitteln. Die Pipeline funktioniert in vier Schritten:
sort— bringt gleiche Zeilen nebeneinanderuniq -c— zählt jede Gruppe und stellt die Anzahl voransort -rn— sortiert numerisch absteigend nach der Zählunghead— zeigt die Top-N
printf "apfel\nbirne\napfel\nkirsche\napfel\nbirne\n" \
| sort | uniq -c | sort -rn | head -n 3 3 apfel
2 birne
1 kirscheDieses Muster taucht in praktisch jeder Log-Analyse auf — IP-Adressen zählen, Status-Codes auswerten, Wortfrequenzen ermitteln.
-d, -u und -D im Vergleich
Die drei Filter-Optionen zeigen unterschiedliche Sichten auf dieselbe Eingabe. Bei sortierter Liste apfel apfel birne kirsche kirsche kirsche ergeben sie:
| Option | Bedeutung | Ausgabe (Beispiel) |
|---|---|---|
| (kein Flag) | Jede Gruppe einmal | apfel, birne, kirsche |
-d | Nur Gruppen mit Duplikaten — einmal pro Gruppe | apfel, kirsche |
-D | Nur Duplikate — alle Vorkommen | apfel, apfel, kirsche, kirsche, kirsche |
-u | Nur Singletons | birne |
printf "apfel\napfel\nbirne\nkirsche\nkirsche\nkirsche\n" | uniq -dapfel
kirscheprintf "apfel\napfel\nbirne\nkirsche\nkirsche\nkirsche\n" | uniq -ubirneFelder und Zeichen überspringen
Mit -f N ignoriert uniq die ersten N Felder beim Vergleich, mit -s N die ersten N Zeichen. Praktisch ist das vor allem bei Logs, wo ein wechselnder Timestamp am Zeilenanfang verhindert, dass identische Restzeilen erkannt werden.
printf "12:00 login\n12:01 login\n12:02 logout\n" | uniq -f 1 -c 2 12:00 login
1 12:02 logout-s arbeitet zeichengenau und ist nützlich, wenn die Präfixlänge fix ist (z. B. ein 19-stelliger ISO-Timestamp 2026-05-05T12:00:00).
sort access.log | uniq -s 19 -c | sort -rn | headPraxis
Top-N-Zugriffe in nginx-Logs
Klassische Auswertung: welche IP-Adressen haben am häufigsten zugegriffen?
awk '{print $1}' access.log | sort | uniq -c | sort -rn | headawk extrahiert das erste Feld (IP), sort gruppiert, uniq -c zählt, sort -rn ordnet absteigend, head schneidet auf die Top 10.
Doppelte Zeilen in einer Datei finden
sort datei.txt | uniq -d-d gibt jede Duplikat-Gruppe genau einmal aus — ideal für Hash-Listen, E-Mail-Adressen oder Konfigurations-Keys, bei denen du nur wissen willst, welche Werte mehrfach auftauchen, nicht wie oft.
Wordcount-Trick
Mit tr werden Leerzeichen zu Zeilenumbrüchen, danach lässt sich die Wortfrequenz wie gewohnt zählen.
tr -s '[:space:]' '\n' < text.txt | sort | uniq -c | sort -rn | headtr -s '[:space:]' '\n' faltet jede Whitespace-Folge zu einem einzigen Newline, sodass jede Zeile genau ein Wort enthält. Achtung: Satzzeichen bleiben am Wort kleben — für saubere Wortzählung schaltet man noch ein tr -d '[:punct:]' oder ein tr 'A-Z' 'a-z' davor, je nach Anforderung.
Stolperfallen
uniq ohne sort übersieht Duplikate.
Der wohl häufigste uniq-Bug: ohne vorheriges sort werden nur direkt benachbarte Wiederholungen erkannt. Eine Datei mit apfel, birne, apfel liefert mit uniq drei Zeilen — beide Apfel-Einträge bleiben stehen, weil die Birne dazwischen sitzt. Faustregel: Wer uniq schreibt, schreibt davor fast immer auch sort.
sort -u ist effizienter als sort | uniq.
Wenn du sort und uniq ausschließlich zum Deduplizieren kombinierst, ist sort -u die schlankere und schnellere Variante: das Sortier-Tool entfernt Duplikate direkt während des Sortierens, ohne Pipe und zweiten Prozess. sort | uniq lohnt sich nur dann, wenn du Optionen wie -c, -d oder -D brauchst, die sort -u nicht bietet.
-c braucht zwingend sortierten Input.
uniq -c zählt nur aufeinanderfolgende Gruppen. Bei unsortierter Eingabe entstehen mehrere Teilzählungen pro Wert — apfel taucht dann z. B. zweimal mit jeweils 1 und 2 auf, statt einmal mit 3. Das Ergebnis sieht plausibel aus, ist aber falsch. Vor jeder Frequenz-Auswertung gehört sort davor.
BSD- und GNU-uniq weichen bei -D ab.
Auf macOS (BSD-Userland) und auf Linux (GNU-Coreutils) verhält sich -D nicht identisch. GNU-uniq kennt zusätzlich --all-repeated=METHOD mit Methoden wie prepend oder separate, die Duplikatgruppen mit Leerzeilen trennen können. BSD-uniq versteht diese Form nicht. Wer portable Skripte schreibt, sollte sich auf -c, -d und -u beschränken.
Whitespace-Unterschiede zählen — auch unsichtbare.
uniq vergleicht die rohe Zeile inklusive Trailing-Whitespace und Tabs. Zwei augenscheinlich identische Zeilen, von denen eine mit einem Leerzeichen endet, gelten als unterschiedlich. Wenn die Quelle ungetrimmten Output liefert (z. B. CSV-Exporte aus Tabellenkalkulationen), hilft ein vorgeschaltetes sed 's/[[:space:]]*$//' oder awk '{$1=$1; print}', bevor uniq zum Einsatz kommt.
Weiterführende Ressourcen
Externe Quellen
- uniq(1) – Linux manual page (man7.org) — offizielle Dokumentation aller uniq-Optionen
- GNU Coreutils Manual: uniq invocation — ausführliche Beschreibung im GNU-Handbuch
- Arch Wiki: Core utilities — Übersicht über uniq und verwandte Werkzeuge
Verwandte Artikel
- sort – Zeilen sortieren — der Pflichtbegleiter von uniq
- cut – Spalten extrahieren — Felder aus Textdateien herausschneiden
- wc – Zeilen, Woerter und Bytes zählen — Mengen zählen statt Werte gruppieren
- awk – Textverarbeitung mit Mustern — flexible Feld- und Mustererkennung
- grep – Zeilen filtern — Zeilen nach Mustern selektieren