Linux-Tutorial / Text mit grep, sort, uniq, cut und wc suchen und verarbeiten

Verwenden Sie grep, um passende Zeilen auszuwählen, sort, um Zeilen zu ordnen, uniq, um benachbarte Duplikate zu kombinieren, cut, um durch Trennzeichen abgegrenzte Felder zu extrahieren, und wc, um Zeilen, Wörter oder Bytes zu zählen. Diese Befehle schreiben normalerweise ein Ergebnis auf die Standardausgabe, anstatt die Eingabedatei zu bearbeiten. Durch das Verbinden in der richtigen Reihenfolge können Sie nützliche kleine Textverarbeitungsaufgaben durchführen.

Die Shell-Verbindung zwischen den Pipeline-Stufen wird erklärt in Shell-Variablen und Ablauf. Vergleichen Sie hier bekannte Eingabedaten mit den resultierenden Zählungen.

Erstellen Sie eine kleine Datendatei

Diese Lektion setzt Bash und GNU-Dienstprogramme voraus. Wenn ~/linux-course-12-practice bereits existiert, wählen Sie einen anderen Namen. Fahren Sie nicht mit der Dateierstellung fort, wenn das neue Verzeichnis nicht erstellt werden kann: > überschreibt eine vorhandene Zieldatei.

mkdir ~/linux-course-12-practice
cd ~/linux-course-12-practice
pwd

Nachdem Sie Ihren Standort bestätigt haben, erstellen Sie fünf Einträge mit einem Namen und einem Status, getrennt durch einen Doppelpunkt.

printf 'alpha:ready\nbeta:waiting\nalpha:done\ngamma:ready\nbeta:ready\n' > records.txt
cat records.txt

cat gibt die fünf eingegebenen Zeilen aus. Jedes Beispiel unten verwendet dieselbe Datei.

Wählen Sie passende Zeilen mit grep aus

grep gibt Zeilen aus, die einem Muster entsprechen. Fügen Sie -n hinzu, um die Nummer jeder Zeile in der Eingabedatei anzuzeigen.

grep -n 'ready' records.txt

Drei Zeilen stimmen überein; waiting enthält ready nicht.

1:alpha:ready
4:gamma:ready
5:beta:ready

Ein grundlegendes grep-Muster ist ein regulärer Ausdruck, überprüfen Sie also die Bedeutung der Sonderzeichen. Verwenden Sie grep -F für einen wörtlichen festen String. Keine übereinstimmende Zeile gibt im Allgemeinen den Exit-Status 1, während ein Befehlsfehler 2 zurückgibt; behandeln Sie nicht alle leeren Ausgaben als denselben Fehler.

Felder mit cut extrahieren und mit wc zählen

cut -d: -f1 nimmt das erste durch Doppelpunkte abgegrenzte Feld aus jedem Datensatz, wodurch nur noch Namen übrig bleiben:

cut -d: -f1 records.txt
alpha
beta
alpha
gamma
beta

cut verarbeitet einfache Trennzeichen; es analysiert keine in Anführungszeichen gesetzten Felder oder eingebetteten Zeilenumbrüche wie ein vollständiger CSV-Parser. wc -l records.txt zeigt eine Zeilenanzahl von 5 neben dem Dateinamen an.

wc -l records.txt

wc -w zählt Wörter, und wc -c zählt Bytes. Ein Mehrbyte-Zeichen, wie ein koreanisches Zeichen, kann mehr als ein Byte belegen. GNU wc -m zählt Zeichen, wenn das erforderlich ist.

Verbinden Sie sort und uniq in der richtigen Reihenfolge

sort ordnet Zeilen. uniq kombiniert nur benachbarte identische Zeilen, daher zuerst sortieren, wenn identische Namen in der Eingabe getrennt sind. Die Pipe | leitet die Standardausgabe eines Befehls an die Standardeingabe des nächsten Befehls weiter.

cut -d: -f1 records.txt | sort | uniq -c

Das Ergebnis zählt alpha zweimal, beta zweimal und gamma einmal. Führende Leerzeichen und Sortierreihenfolge können je nach Gebietsschema und Implementierung variieren.

      2 alpha
      2 beta
      1 gamma

Wenn Sie stattdessen sort | uniq auf den vollständigen Datensätzen ausführen, bleiben alpha:ready und alpha:done unterschiedlich. Entscheiden Sie, was als Duplikat gilt, bevor Sie auswählen, welches Feld extrahiert werden soll. Die Sortierung verwendet die Gebietsschema-Kollationsregeln, sofern Sie nichts anderes angeben. Vergleichen Sie die Gebietsschematainstellungen, wenn die Ergebnisse zwischen Systemen unterschiedlich sind.

Wählen Sie ein Werkzeug für die Frage

Ziel Werkzeug Wichtiger Gesichtspunkt
Übereinstimmende Zeilen grep Regulärer Ausdruck versus wörtliches Muster
Zeilenreihenfolge sort Gebietsschema und Sortierschlüssel
Deduplizierung oder Häufigkeit uniq Gleiche Werte müssen nebeneinander stehen
Einfache durch Trennzeichen getrennte Felder cut Trennzeichen und Feldnummer
Zeilen, Wörter oder Bytes wc Wählen Sie die Zähloption

Wenn ein Ergebnis leer oder unerwartet ist, überprüfen Sie zuerst records.txt mit cat. Führen Sie dann jeden Teil einer längeren Pipeline separat aus, um zu sehen, ob das Muster, das Trennzeichen oder die Sortierstufe das Ergebnis verändert hat.

Ändern Sie eine Eingabe: Fügen Sie einen Beta-Datensatz zu der ursprünglichen fünfzeiligen Labor-Datei hinzu. Die Beta-Anzahl wird 3 und die Gesamtzahl 6. Stellen Sie die ursprünglichen Übungsdaten wieder her und zählen Sie erneut.

printf 'beta:ready\n' >> records.txt
cut -d: -f1 records.txt | sort | uniq -c
wc -l records.txt
printf 'alpha:ready\nbeta:waiting\nalpha:done\ngamma:ready\nbeta:ready\n' > records.txt
cut -d: -f1 records.txt | sort | uniq -c
wc -l records.txt

Nach der Wiederherstellung erwarten Sie wieder alpha 2, beta 2, gamma 1 und insgesamt 5 Zeilen. Wenden Sie dieses Überschreiben nur auf die in dieser Lektion erstellte Labordatei an.

Offizielle Dokumentation

Das GNU grep-Handbuch behandelt das Abgleichen und die Exit-Status; das GNU Coreutils-Handbuch behandelt sort, uniq, cut und wc.