VMware ESXi and vSphere Cluster Management
Linux uniq-Befehl: Doppelte Zeilen erkennen und entfernen
Lerne den Linux-Befehl uniq kennen: benachbarte Duplikate entfernen, Wiederholungen zählen, eindeutige Werte finden und sort mit uniq kombinieren.
Der Linux-Befehl uniq verarbeitet zeilenorientierte Texte. Er fasst identische, direkt aufeinanderfolgende Zeilen zu einer Gruppe zusammen. Ohne Optionen gibt er aus jeder solchen Gruppe nur eine Zeile aus.
uniq kann eine Datei lesen oder Daten über die Standardeingabe aus einer Pipeline erhalten. Eine Pipeline ist die Weitergabe der Ausgabe eines Befehls an den nächsten Befehl mit dem Zeichen |.
Was macht uniq?
Eine Textzeile ist eine Folge von Zeichen bis zum Zeilenende. uniq vergleicht solche Zeilen und erkennt gleiche Zeilen, wenn sie unmittelbar hintereinander stehen.
uniq DATEI
Bei einer bereits sortierten Datei wird aus jeder Gruppe gleicher Zeilen ein Eintrag:
cat namen-sortiert.txt
Anna
Anna
Ben
Clara
Clara
Clara
uniq namen-sortiert.txt
Anna
Ben
Clara
Die Originaldatei wird dabei nicht automatisch verändert. Die Ausgabe erscheint zunächst auf der Standardausgabe, also normalerweise im Terminal.
Die wichtigste Einschränkung: nur benachbarte Duplikate
Benachbarte Zeilen stehen direkt nacheinander. uniq sucht nicht global nach jedem gleichen Wert in der gesamten Datei. Gleiche Zeilen, die durch andere Zeilen getrennt sind, gehören für uniq zu unterschiedlichen Gruppen.
| Eingabefolge | Befehl | Ergebnis | Warum |
|---|---|---|---|
| Bereits benachbarte Wiederholungen | uniq datei.txt | Jede Gruppe erscheint einmal. | Die gleichen Zeilen stehen direkt hintereinander. |
Verteilte Wiederholungen ohne sort | uniq datei.txt | Getrennte Wiederholungen bleiben getrennt. | uniq vergleicht nur die aktuelle Gruppe mit der vorherigen. |
Verteilte Wiederholungen mit sort | sort datei.txt | uniq | Jeder Wert erscheint einmal. | sort stellt gleiche Werte nebeneinander. |
cat namen.txt
Anna
Ben
Anna
Clara
Ben
uniq namen.txt
Anna
Ben
Anna
Clara
Ben
Hier wird keine Zeile entfernt, weil keine gleiche Zeile direkt auf ihre Wiederholung folgt. Für eine vollständige Bereinigung lautet die übliche Pipeline:
sort namen.txt | uniq
Die Reihenfolge ist entscheidend: uniq | sort entfernt nur Wiederholungen, die schon vor dem Sortieren benachbart waren. sort | uniq gruppiert dagegen zunächst alle gleichen Werte.
Grundsyntax und Ausgabe
Die allgemeine Syntax lautet:
uniq [OPTIONEN] [DATEI]
Optionen stehen vor dem Dateinamen. Wird keine Datei angegeben, liest uniq von der Standardeingabe:
sort namen.txt | uniq
Das Ergebnis kann in eine neue Datei umgeleitet werden:
sort eingabe.txt | uniq > eindeutig.txt
Die Eingabedatei bleibt dabei erhalten. GNU-uniq unterstützt außerdem je nach System die Option -o AUSGABE, um direkt eine Ausgabedatei anzugeben. Da diese Option nicht in jeder Implementierung verfügbar ist, ist die Umleitung mit > die portablere Vorgehensweise.
Wichtige uniq-Optionen
| Option | Langform | Wirkung | Typischer Einsatz |
|---|---|---|---|
-c | --count | Stellt jeder Gruppe ihre Anzahl voran. | Häufigkeiten zählen. |
-d | --repeated | Gibt nur Gruppen aus, die mehrfach vorkommen. | Doppelte Werte suchen. |
-u | --unique | Gibt nur Gruppen mit genau einem Element aus. | Werte finden, die nur einmal vorkommen. |
-i | --ignore-case | Ignoriert Groß- und Kleinschreibung beim Vergleich. | Admin, ADMIN und admin gleich behandeln. |
-f N | — | Überspringt die ersten N Felder beim Vergleich. | Nach späteren Leerraumfeldern gruppieren. |
-s N | — | Überspringt die ersten N Zeichen beim Vergleich. | Ein Präfix ignorieren. |
-w N | — | Vergleicht höchstens die ersten N Zeichen. | Nur einen Zeilenanfang berücksichtigen. |
Duplikate mit -d ausgeben
-d beziehungsweise --repeated beschränkt die Ausgabe auf Werte aus Gruppen, die mindestens zweimal vorkommen. Jede solche Gruppe wird standardmäßig einmal repräsentiert.
sort namen.txt | uniq -d
Wenn die sortierte Eingabe Anna dreimal und Ben einmal enthält, gibt dieser Befehl Anna nur einmal aus. Er zeigt nicht drei Kopien.
Einmalige Zeilen mit -u ausgeben
-u beziehungsweise --unique gibt nur Zeilen aus Gruppen aus, die genau ein Element enthalten:
sort namen.txt | uniq -u
Das ist etwas anderes als eine deduplizierte Gesamtausgabe. sort datei.txt | uniq gibt jeden verschiedenen Wert einmal aus, auch wenn er mehrfach vorkommt. sort datei.txt | uniq -u lässt dagegen nur Werte übrig, die insgesamt genau einmal vorkommen.
Häufigkeiten mit -c zählen
Mit -c beziehungsweise --count stellt uniq jeder Gruppe ihre Anzahl voran:
sort namen.txt | uniq -c
Eine mögliche Ausgabe sieht so aus:
2 Anna
1 Ben
3 Clara
Für eine Häufigkeitsanalyse werden gleiche Werte zuerst gruppiert und gezählt. Danach kann die Ausgabe mit sort -nr numerisch und absteigend nach der Anzahl sortiert werden:
sort zugriffe.log | uniq -c | sort -nr
-n aktiviert die numerische Sortierung, -r kehrt die Reihenfolge um. Die häufigsten Werte stehen dadurch oben.
| Variante | Ausgegebene Gruppen | Beispielverwendung |
|---|---|---|
| Standardausgabe | Eine Zeile je benachbarter Gruppe | sort datei.txt | uniq |
uniq -d | Nur mehrfach vorkommende Gruppen | sort datei.txt | uniq -d |
uniq -u | Nur Gruppen mit genau einem Element | sort datei.txt | uniq -u |
uniq -c | Alle Gruppen mit ihrer Anzahl | sort datei.txt | uniq -c |
Das Vergleichsverhalten anpassen
Standardmäßig müssen die verglichenen Zeichen einschließlich ihrer Groß- und Kleinschreibung übereinstimmen. Einige Optionen verändern nur die Vergleichslogik. Die ausgegebene Zeile bleibt normalerweise unverändert und wird nicht automatisch in Kleinbuchstaben umgewandelt oder gekürzt.
Groß- und Kleinschreibung ignorieren
Mit -i oder --ignore-case gelten Groß- und Kleinbuchstaben beim Vergleich als gleich:
sort -f benutzer.txt | uniq -i -c
Die Option -f von sort sorgt dafür, dass Varianten wie Admin, ADMIN und admin bereits beim Sortieren nebeneinander stehen. uniq -i verwendet dieselbe Regel beim anschließenden Vergleich. Beide Befehle müssen also passend konfiguriert sein.
Felder überspringen
Ein Feld ist bei uniq standardmäßig ein durch Leerraum abgegrenzter Bereich einer Zeile. Leerraum umfasst typischerweise Leerzeichen und Tabulatoren. Mit -f N werden die ersten N Felder beim Vergleich übersprungen.
sort -k2,2 daten.txt | uniq -f 1 -c
Bei Zeilen wie 101 Berlin und 202 Berlin wird das erste Feld ignoriert. Für den Vergleich bleibt dann nur der Teil ab dem zweiten Feld relevant. sort -k2,2 muss dazu passend nach dem zweiten Feld sortieren.
Zeichen überspringen oder begrenzen
-s N überspringt die ersten N Zeichen. Das ist nützlich, wenn ein fester Präfix nicht berücksichtigt werden soll.
uniq -s 8 datei.txt
-w N begrenzt den Vergleich auf die ersten N Zeichen:
uniq -w 12 datei.txt
Auch bei diesen Optionen bleibt die ausgegebene Originalzeile normalerweise vollständig erhalten. Nur der Bereich, den uniq zur Gleichheitsprüfung heranzieht, ändert sich.
Optionen kombinieren
Optionen lassen sich kombinieren, wenn die gewünschte Auswertung dies erfordert:
uniq -c datei.txt
uniq -d datei.txt
uniq -u datei.txt
sort -f benutzer.txt | uniq -i -c
Bei feld- oder zeichenbasierten Vergleichen muss auch sort mit passenden Optionen arbeiten. Es reicht nicht, nur uniq -f 1 zu verwenden, wenn gleiche Vergleichswerte dadurch nicht nebeneinander sortiert werden. Die Regeln von sort und uniq müssen dieselben relevanten Felder, Zeichen und die gleiche Groß-/Kleinschreibung berücksichtigen.
Praktische Einsatzfälle
Listen bereinigen
Benutzernamen, Hostnamen, E-Mail-Adressen oder andere Werte lassen sich als eine eindeutige Liste ausgeben:
sort benutzer.txt | uniq
sort hosts.txt | uniq
sort email-adressen.txt | uniq
Doppelte Konfigurationseinträge suchen
Bei einer zeilenorientierten Konfigurationsliste kann die Kombination aus Sortierung und -d wiederholte Einträge sichtbar machen:
sort konfiguration.txt | uniq -d
Vor dem Sortieren solltest du prüfen, ob die Reihenfolge der Konfigurationsdatei semantisch wichtig ist. Die Pipeline sortiert die Ausgabe für die Analyse, verändert aber nicht automatisch die Originaldatei.
Häufige Logwerte ermitteln
Wenn jede Eingabezeile den zu analysierenden Wert vollständig enthält, eignet sich folgende Pipeline:
sort zugriffe.log | uniq -c | sort -nr
Für einzelne Spalten einer Logzeile werden meist zusätzliche Werkzeuge wie cut oder awk benötigt, bevor sort und uniq arbeiten.
Ergebnis sicher speichern
sort eingabe.txt | uniq > eindeutig.txt
Die Ausgabe wird in einer separaten Datei gespeichert. So bleibt die Originaldatei erhalten und kann vor einer weiteren Verarbeitung geprüft werden.
Grenzen und bewusste Entscheidungen
uniqverändert keine Datei automatisch. Es schreibt auf die Standardausgabe oder in eine ausdrücklich angegebene Zielausgabe.- Das Werkzeug ist für zeilenbasierte Daten gedacht. Für binäre oder nicht zeilenorientierte Daten ist es ungeeignet.
- Leerzeichen, Tabulatoren und zusätzliche Endbereiche können beeinflussen, ob zwei Zeilen als gleich gelten.
- Groß- und Kleinschreibung muss bewusst behandelt werden, beispielsweise mit
-i. - Bei CSV-Dateien mit komplexen, zitierten Feldern sind einfache Leerraum-Feldoptionen wie
-foft nicht ausreichend. Verwende dafür eine CSV-taugliche Vorverarbeitung oder ein spezialisiertes Werkzeug. - Eine sortierte Ausgabe kann die ursprüngliche Reihenfolge verlieren. Wenn die Reihenfolge fachlich wichtig ist, muss die gewünschte Verarbeitung anders geplant werden.
Fehlerbehebung
Duplikate bleiben trotz uniq erhalten
Ursache: Die gleichen Zeilen stehen nicht direkt nebeneinander.
sort datei.txt | uniq
Durch sort werden gleiche Werte zu einer gemeinsamen Gruppe zusammengeführt.
uniq -d liefert weniger Treffer als erwartet
Mögliche Ursachen sind getrennte Wiederholungen, unterschiedliche Groß-/Kleinschreibung oder abweichende Leerzeichen. Sortiere zunächst passend und verwende bei Bedarf -i:
sort -f datei.txt | uniq -i -d
Groß- und Kleinschreibung wird getrennt gezählt
Ohne besondere Optionen sind Admin und admin verschiedene Werte. Kombiniere eine dazu passende Sortierung mit uniq -i:
sort -f benutzer.txt | uniq -i -c
Die Gruppierung nach einer Spalte funktioniert nicht
Prüfe, ob sort und uniq dieselbe Spalte vergleichen und ob die Feldtrennung zur Datei passt:
sort -k2,2 daten.txt | uniq -f 1
Bei Komma- oder Semikolon-getrennten Dateien sind Leerraumfelder nicht automatisch die richtigen Spalten.
Die Originaldatei soll erhalten bleiben
Schreibe die Ausgabe zunächst in eine separate Datei:
sort eingabe.txt | uniq > ausgabe.txt
Vermeide insbesondere eine direkte Umleitung in dieselbe Datei, aus der gelesen wird. Prüfe die neue Datei, bevor du sie gegebenenfalls weiterverwendest.
Merksätze für Prüfung und Praxis
uniqerkennt ohne Vorbereitung nur benachbarte gleiche Zeilen.- Für globale Duplikatgruppen ist meist
sort DATEI | uniqdie richtige Grundform. -dzeigt mehrfach vorkommende Gruppen,-unur einmal vorkommende Gruppen und-czählt Gruppen.-i,-f,-sund-wverändern den Vergleich, normalerweise aber nicht die dargestellte Zeile.- Bei Spaltenvergleichen müssen die Sortier- und Vergleichsregeln zusammenpassen.
- Die Originaldatei wird von
uniqnicht automatisch geändert.