Einführung
Kleine Linux-Befehle werden wesentlich leistungsfähiger, wenn die Shell sie miteinander koordiniert. Ein Befehl meldet Erfolg oder Fehlschlag über einen Exit-Status. Sequenzoperatoren bestimmen, welcher Befehl als Nächstes ausgeführt wird. Eine Pipe verbindet die Standardausgabe eines Befehls mit der Standardeingabe eines anderen Befehls.
Sie erarbeiten diese Grundlagen Schritt für Schritt und verwenden anschließend grep, cut, wc, sort und uniq, um einen kleinen Datensatz mit Serviceereignissen zu verarbeiten. In späteren Textverarbeitungslaboren werden Sie diese Filter genauer kennenlernen. Im Mittelpunkt dieses Labors steht daher, wie Daten und Entscheidungen zwischen Befehlen weitergegeben werden.
Exit-Status von Befehlen beobachten
In diesem Schritt verknüpfen Sie das sichtbare Verhalten eines Befehls mit dem numerischen Status, den die Shell speichert.
Ein Exit-Status von 0 bedeutet Erfolg. Ein Wert ungleich null bedeutet, dass der Befehl die angeforderte Operation nicht abschließen konnte. Führen Sie zunächst eine erfolgreiche Dateiprüfung aus und geben Sie direkt danach $? aus. Diese Variable enthält den Status des zuletzt ausgeführten Befehls:
cd /home/labex/project/pipeline-lab
test -f events.csv
echo $?
Die Ausgabe lautet 0. Prüfen Sie nun eine nicht vorhandene Datei:
test -f missing.csv
echo $?
Der Status ist ungleich null. Lesen Sie $? sofort aus, da jeder nachfolgende Befehl diesen Wert ersetzt.
Erstellen Sie mit einer if-Anweisung eine zuverlässige Beobachtung. Vollständige Shell-Skripte lernen Sie später kennen; hier wandelt die Anweisung den Status lediglich in Text um:
if test -f events.csv; then echo "events.csv is ready"; else echo "events.csv is missing"; fi > status-result.txt
cat status-result.txt
Steuern, welcher Befehl als Nächstes ausgeführt wird
In diesem Schritt vergleichen Sie unbedingte und bedingte Befehlsoperatoren.
Ein Semikolon führt den nächsten Befehl unabhängig vom Ergebnis des vorherigen Befehls aus:
false; echo "semicolon continues"
&& führt den rechten Befehl nur nach einem erfolgreichen Abschluss aus:
test -f events.csv && echo "input found"
test -f missing.csv && echo "you should not see this"
|| führt den rechten Befehl nur aus, wenn der vorherige Befehl fehlschlägt:
test -f missing.csv || echo "input missing"
Mit diesen Operatoren können Sie eine einfache Erfolgs- oder Fehlerentscheidung ausdrücken. Kopieren Sie den Datensatz nur, wenn er vorhanden ist. Andernfalls geben Sie eine Fehlermeldung aus:
test -f events.csv && cp events.csv working.csv || echo "Copy failed"
Prüfen Sie, ob die geschützte Kopie mit der Quelldatei übereinstimmt:
cmp events.csv working.csv && echo "guarded copy matches" > sequence-result.txt
cat sequence-result.txt
Verwenden Sie bei komplexer Logik vorzugsweise eine gut lesbare if-Anweisung. Lange Verkettungen mit && und || können mehrdeutig werden.
Ausgabe durch eine Pipeline leiten
In diesem Schritt verbinden Sie Befehle mit | und beobachten, wie jede Stufe den Datenstrom weiter einschränkt.
Der linke Befehl schreibt seine Standardausgabe in die Pipe. Der rechte Befehl liest diese Daten als Standardeingabe. Wählen Sie ausschließlich Datensätze mit ERROR aus:
cd /home/labex/project/pipeline-lab
cat events.csv | grep ',ERROR,'
grep kann eine Datei direkt lesen. Daher liefert die folgende kürzere Form dasselbe Ergebnis:
grep ',ERROR,' events.csv
Fügen Sie wc -l hinzu, um die passenden Zeilen zu zählen:
grep ',ERROR,' events.csv | wc -l
Speichern Sie sowohl den gefilterten Datenstrom als auch die Anzahl. tee dupliziert seine Standardeingabe: Eine Kopie schreibt es in error-events.csv, die andere gibt es über die Standardausgabe an den nächsten Befehl weiter. Das abschließende wc -l zählt daher genau die Zeilen, die gespeichert wurden:
grep ',ERROR,' events.csv | tee error-events.csv | wc -l > error-count.txt
cat error-events.csv
cat error-count.txt
Untersuchen Sie beide Dateien nach Abschluss der Pipeline. error-events.csv enthält die passenden Datensätze, während error-count.txt deren Anzahl enthält.
Felder mit Cut extrahieren
In diesem Schritt behandeln Sie jede CSV-Zeile als eine Folge von durch Trennzeichen separierten Feldern.
cut -d, -f1 verwendet das Komma als Trennzeichen und gibt Feld 1 aus, also den Namen des Service:
cd /home/labex/project/pipeline-lab
cut -d, -f1 events.csv
Geben Sie die Felder für Service und Schweregrad gemeinsam aus:
cut -d, -f1,2 events.csv
Kombinieren Sie Filterung und Extraktion, um nur die Services aufzulisten, die Warnungen erzeugt haben:
grep ',WARN,' events.csv | cut -d, -f1
Speichern Sie dieses Zwischenergebnis:
grep ',WARN,' events.csv | cut -d, -f1 > warning-services.txt
cat warning-services.txt
cut eignet sich gut für einfache Datensätze, in denen das Trennzeichen nicht innerhalb eines Feldes vorkommt. Komplexere Formate erfordern möglicherweise awk oder ein formatbewusstes Werkzeug.
Wiederholte Werte sortieren und zählen
In diesem Schritt erstellen Sie eine vollständige Häufigkeitspipeline und verstehen, warum die Sortierung vor uniq erfolgt.
uniq fasst nur aufeinanderfolgende gleiche Zeilen zusammen. Extrahieren Sie zunächst die Servicenamen und sortieren Sie sie anschließend, damit gleiche Werte nebeneinanderstehen:
cd /home/labex/project/pipeline-lab
cut -d, -f1 events.csv | sort
Fügen Sie uniq -c hinzu, um jeden zusammenhängenden Lauf gleicher Namen zu zählen:
cut -d, -f1 events.csv | sort | uniq -c
Sortieren Sie die Zählwerte numerisch in absteigender Reihenfolge. sort -k1,1nr verwendet das erste Feld als numerischen Schlüssel in umgekehrter Reihenfolge:
cut -d, -f1 events.csv | sort | uniq -c | sort -k1,1nr
Speichern Sie den abschließenden Bericht:
cut -d, -f1 events.csv | sort | uniq -c | sort -k1,1nr > service-frequency.txt
cat service-frequency.txt
Lesen Sie diese Pipeline von links nach rechts: extrahieren → sortieren → aufeinanderfolgende Duplikate zählen → Zählwerte nach Rang ordnen.
Zusammenfassung
Sie haben den Exit-Status als Erfolgssignal der Shell verwendet, die Ausführung mit ;, && und || gesteuert und Pipelines mit klaren Stufen erstellt. Anschließend haben Sie Datensätze gefiltert, Felder extrahiert, Zeilen gezählt, Werte sortiert und Duplikate gezählt. Damit beherrschen Sie genau die grundlegenden Begriffe, die Sie für die nächste Datenpipeline-Challenge benötigen.



