GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Uniq-Befehl in Linux mit Beispielen erklärt

Lernen Sie anhand dieser praktischen Beispiele, den Befehl uniq unter Unix und Linux zu verwenden.

Der uniq-Befehl in Unix und Linux wird zum Filtern von doppeltem Text verwendet. Es kann allein verwendet werden, wird aber häufig zusammen mit anderen Befehlen verwendet, z. B. um redundante Informationen in einer Datei zu identifizieren.

Hier ist die Syntax des uniq-Befehls:

uniq [options] <input-file> <output-file>

Wenn Sie uniq ohne Optionen ausführen, verwendet es stdin und stdout für die Ein- und Ausgabe.

Während die Verwendung von stdin über die Zwischenablage (Kopieren/Einfügen) möglich ist, ist dies nicht die praktischste Verwendung.

Stattdessen möchten Sie diesen Befehl wahrscheinlich für eine Datei verwenden, von der Sie vermuten, dass sie doppelte Informationen enthält.

Eine Einschränkung des uniq-Befehls besteht darin, dass er nur Duplikate identifiziert, die in der Datei nebeneinander oder nebeneinander liegen. Das ist ziemlich einfach, aber lassen Sie mich Ihnen ein Beispiel zeigen, damit Sie es in Aktion sehen können.

[[email protected] ~]$ cat apple.txt
apple
apple
orange
orange
apple 
orange
[[email protected] ~]$ uniq apple.txt 
apple
orange
apple 
orange

Sie wissen also sofort, dass Sie dem Programm nicht vertrauen können, jedes Duplikat von alleine zu identifizieren. Es gibt einige Möglichkeiten, dies zu umgehen, und normalerweise geschieht dies mit dem Sortierbefehl.

Ich werde es dir später in diesem Artikel zeigen. Lassen Sie mich zunächst einige Beispiele durchgehen, um Sie mit „uniq“ vertraut zu machen, bevor ich andere Befehle einmische und möglicherweise Dinge verwirre.

7 Beispiele für den uniq-Befehl in Linux

Ich habe ein echtes Systemprotokoll verwendet, es aber zu Demonstrationszwecken bearbeitet. Der größte Teil der Datei wurde bereits in benachbarter Reihenfolge sortiert, aber ich habe ein paar Zeilen „fehl am Platz“ gelassen, um die Funktionalität des uniq-Befehls zu zeigen.

https://gist.github.com/abhishekpc/7dada8c6e57fd5b854f9d2dae72dddb0 BEISPIELTEXT-DATEI HERUNTERLADEN

Beispiel 1:Verwenden des uniq-Befehls auf die standardmäßige Weise

Obwohl ich Ihnen das bereits gezeigt habe, schauen wir uns unsere Beispieldatei mit der Standard-Syntax an.

[[email protected] ~]$ uniq sample_log_file.txt 
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
/usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Sie können sehen, dass viele der doppelten Zeilen konsolidiert sind, aber immer noch redundante Informationen enthalten. Dies liegt an der bereits beschriebenen Funktionseinschränkung. Sehen wir uns ein paar weitere Beispiele an und untersuchen einige der Optionen, die in das Befehlszeilenprogramm „uniq“ integriert sind.

Beispiel 2:Gefilterte Ergebnisse in Zieldatei ausgeben

Möglicherweise möchten Sie diese Ausgabe speichern, damit Sie sie einfach bearbeiten oder aufbewahren können. Sie können unsere Ausgabe in eine separate Datei statt in die normale stdout (Terminal) leiten. Es ist wichtig zu beachten, dass Sie dieses Format nicht verwenden können, um die Originaldatei zu überschreiben.

[[email protected] ~]$ uniq sample_log_file.txt uniq_log_output.txt 

Hier ist der Inhalt der Ausgabedatei:

[[email protected] ~]$ cat uniq_log_output.txt 
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
/usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Beispiel 3:Verwendung von „-c“, um die Anzahl der wiederholten Zeilen abzurufen

Diese Option ist ziemlich selbsterklärend. Das Programm hängt die Anzahl am Anfang jeder Zeile an.

[[email protected] ~]$ uniq sample_log_file.txt -c
      2 /usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
      2 /usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device is a keyboard
      1 /usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device removed
      2 /usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
      5 /usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
      1 /usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
      7 /usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
      1 PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
      8 wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Beispiel 4:Nur wiederholte Zeilen mit ‚-d‘ drucken

Wie Sie sehen können, werden nur Zeilen angezeigt, die in der gesamten Datei dupliziert werden, wenn Sie die Option -d des uniq-Befehls verwenden.

[[email protected] ~]$ uniq sample_log_file.txt -d
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Beispiel 5:Nur eindeutige Zeilen mit '-u' drucken

Hier erhalten Sie die umgekehrte Ausgabe des vorherigen Befehls. Keiner dieser Befehle wird in der Datei wiederholt.

[[email protected] ~]$ uniq sample_log_file.txt -u
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms

Beispiel 6:Ignoriere Felder oder Zeichen mit uniq ['-f' und '-s']

Dies sind eigentlich zwei Beispiele, aber die Funktionen sind nahezu identisch. Ich werde erklären, wie sie funktionieren, und dann etwas Klarheit über die Unterschiede zwischen den beiden schaffen.

Jeder von ihnen verwendet die folgende Syntax

Skip fields with:
uniq <source_file> -f N
Skip characters with:
uniq <source_file> -s N

In jedem dieser Beispiele ist „N“ die Anzahl der Elemente, die Sie überspringen möchten. Wenn Sie diese Anzahl von Elementen überspringen, beginnt uniq mit dem Vergleich an diesem Punkt, anstatt die gesamte Zeile zu vergleichen.

Die Option „f“ überspringt die zugewiesene Anzahl von Feldern. Die Felder werden anhand des Leerzeichens interpretiert.

[[email protected] ~]$ cat field_separated_values.txt 
blue fish
blue fish
blue fish
blue class
red fish
green fish
two class
two class

Wenn Sie den uniq-Befehl in der zweiten Spalte verwenden möchten, müssen Sie das erste Feld wie folgt überspringen:

[[email protected] ~]$ uniq -f1 field_separated_values.txt  
blue fish
blue class
red fish
two class

Wie Sie sehen können, werden sowohl „roter Fisch“ als auch „grüner Fisch“ als dieselbe Zeile verwendet, da das erste Feld (mit Farben) ignoriert wurde. Wenn Sie hier die Zähloption verwenden, wird Ihnen die Anzahl der gefundenen eindeutigen Zeilen angezeigt:

[[email protected] ~]$ uniq -f1 -c field_separated_values.txt  
      3 blue fish
      1 blue class
      2 red fish
      2 two class

Warum sollten Sie das brauchen? Ich gebe Ihnen ein praktisches Szenario. Viele Protokolldateien haben den Zeitstempel am Anfang der Zeilen. Wenn Sie nur die eindeutigen Zeilen in einer solchen Datei suchen, können Sie das erste Feld mit dem Zeitstempel mit der Option -f überspringen.

Ebenso können Sie eine bestimmte Anzahl von Zeichen überspringen.

[[email protected] ~]$ uniq -s 10 field_separated_values.txt 
blue    fish

Beispiel 7:Verwenden Sie „-w“, um nur N Zeichen zu vergleichen

Die Option „-w“ ermöglicht es uns, eine genaue Anzahl von Zeichen anzugeben, die in unserem Vergleich verwendet werden sollen.

Wenn Sie die Protokolldatei für die vorherigen Beispiele verwendet haben, ist das in Ordnung. Ich wollte den Vergleichstext etwas einfacher gestalten, um Verwirrung zu vermeiden. Wenn nicht, ziehen wir es wieder hoch und sehen, was passiert, wenn Sie nur das erste für Charaktere verwenden, um Duplikate zu finden.

[[email protected] ~]$ uniq -w 4 sample_log_file.txt 
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Alle Zeilen, die mit „/usr“ beginnen, werden nun aus der Perspektive des Programms als „gleich“ identifiziert.

Dies kann sich als hilfreich erweisen, wenn Sie nach einem bestimmten Protokollereignis suchen.

Bonus:Vermeide unvollständige Matches, indem du gleichzeitig 'sort' und 'uniq' verwendest.

Sie können diese Befehle separat ausführen, um den gleichen Effekt zu erzielen, aber wenn Sie unter Linux noch nie eine Pipe (das |-Zeichen) verwendet haben, ist dies eine großartige Möglichkeit, sie kennenzulernen.

Sie können Rohre verwenden, um verschiedene Befehle zu kombinieren, um uns Tastenanschläge zu ersparen und unseren Arbeitsablauf zu verbessern. Die Befehle werden in der Reihenfolge ausgeführt, in der sie eingegeben werden.

Dies ist die Beispieleingabe, die ich verwenden werde:

[[email protected] ~]$ cat apple.txt 
apple
orange
orange
apple
apple
banana
apple
banana

Lassen Sie uns nun die Eingabedatei sortieren und dann den Befehl uniq darauf anwenden. Der Sortierbefehl ordnet den Text neu an, sodass alle Elemente zuerst in benachbarter Reihenfolge angeordnet sind. Wenn dann der uniq-Befehl ausgeführt wird, findet er nur 3 eindeutige Zeilen in der Datei.

[[email protected] ~]$ sort apple.txt | uniq 
apple
banana
orange

Wenn Sie die Reihenfolge umkehren, ändern sich die Dinge. Wenn Sie zuerst den Befehl „uniq“ ausführen, werden nur die benachbarten Duplikate identifiziert, und dann werden sie jeweils mit dem Befehl „sort“ in alphabetischer Reihenfolge sortiert.

[[email protected] ~]$ uniq apple.txt | sort
apple
apple
apple
banana
banana
orange

Pipes ermöglichen es uns, mehrere Befehle gleichzeitig auszuführen, aber es ist wichtig, ihre Reihenfolge zu berücksichtigen.

Beachten Sie, dass der Inhalt der Datei genauso unverändert bleibt, als würden Sie die Befehle einzeln ausführen. Durch das Zusammenführen der beiden Befehle bleiben die Ergebnisse auch im „Speicher“ des Systems. Wenn Sie sie separat ausgeführt haben, konnten Sie diese Ergebnisse nicht erhalten, es sei denn, Sie haben eine neue Datei erstellt und damit den Inhalt des Originals überschrieben, bevor Sie Ihren zweiten Befehl ausführen.

Fazit

Wie Sie sich vorstellen können, ist dies ein wichtiges Konzept beim Erlernen von Bash. Diese speziellen Befehle (sort und uniq) werden oft zusammen verwendet, um schnell Informationen aus großen Dateien wie unserem Pseudo-Log herauszufiltern.


Linux
  1. Befehl zum Herunterfahren von Linux mit Beispielen erklärt

  2. nslookup Linux-Befehl mit Beispielen erklärt

  3. Linux Traceroute-Befehl, erklärt mit Beispielen

  4. whoami-Befehl in Linux mit Beispielen erklärt

  5. Linux-Ping-Befehl mit Beispielen erklärt

Tr-Befehl in Linux mit Beispielen erklärt

w Befehl mit Beispielen in Linux erklärt

Wait-Befehl in Linux mit praktischen Beispielen erklärt

Tee-Befehl in Linux mit Beispielen erklärt

Linux tee-Befehl erklärt (mit Beispielen)

Linux csplit Befehl erklärt (mit Beispielen)