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.

EingabefolgeBefehlErgebnisWarum
Bereits benachbarte Wiederholungenuniq datei.txtJede Gruppe erscheint einmal.Die gleichen Zeilen stehen direkt hintereinander.
Verteilte Wiederholungen ohne sortuniq datei.txtGetrennte Wiederholungen bleiben getrennt.uniq vergleicht nur die aktuelle Gruppe mit der vorherigen.
Verteilte Wiederholungen mit sortsort datei.txt | uniqJeder 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

OptionLangformWirkungTypischer Einsatz
-c--countStellt jeder Gruppe ihre Anzahl voran.Häufigkeiten zählen.
-d--repeatedGibt nur Gruppen aus, die mehrfach vorkommen.Doppelte Werte suchen.
-u--uniqueGibt nur Gruppen mit genau einem Element aus.Werte finden, die nur einmal vorkommen.
-i--ignore-caseIgnoriert 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 NVergleicht 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.

VarianteAusgegebene GruppenBeispielverwendung
StandardausgabeEine Zeile je benachbarter Gruppesort datei.txt | uniq
uniq -dNur mehrfach vorkommende Gruppensort datei.txt | uniq -d
uniq -uNur Gruppen mit genau einem Elementsort datei.txt | uniq -u
uniq -cAlle Gruppen mit ihrer Anzahlsort 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

  • uniq verä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 -f oft 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

  • uniq erkennt ohne Vorbereitung nur benachbarte gleiche Zeilen.
  • Für globale Duplikatgruppen ist meist sort DATEI | uniq die richtige Grundform.
  • -d zeigt mehrfach vorkommende Gruppen, -u nur einmal vorkommende Gruppen und -c zählt Gruppen.
  • -i, -f, -s und -w verändern den Vergleich, normalerweise aber nicht die dargestellte Zeile.
  • Bei Spaltenvergleichen müssen die Sortier- und Vergleichsregeln zusammenpassen.
  • Die Originaldatei wird von uniq nicht automatisch geändert.