Sequenzsteuerung und Pipelines

LinuxBeginner
Jetzt üben

Einführung

Willkommen zu diesem praktischen Lab zur Linux-Befehlsausführung und Textverarbeitung! Falls Sie neu bei Linux sind, machen Sie sich keine Sorgen – wir führen Sie Schritt für Schritt durch das Lab. Wir werden untersuchen, wie man mehrere Befehle effizient ausführt und leistungsstarke Textverarbeitungstools verwendet. Am Ende dieses Labs werden Sie in der Lage sein, Befehle zu kombinieren, Texte zu durchsuchen und Daten wie ein Profi zu manipulieren!

Sequenzielle Ausführung von Befehlen

Unter Linux können Sie mehrere Befehle nacheinander in einer einzigen Zeile ausführen. Dies ist besonders nützlich, wenn Sie eine Reihe zusammenhängender Aufgaben erledigen möchten.

Beginnen wir mit einem einfachen Beispiel. Wir lassen uns das aktuelle Datum anzeigen und listen anschließend den Inhalt Ihres Home-Verzeichnisses auf:

date && ls ~

Hier ist die Erklärung, was dieser Befehl bewirkt:

  • date: Zeigt das aktuelle Datum und die Uhrzeit an.
  • &&: Dieses Symbol steht für „und“. Es weist Linux an, den nächsten Befehl nur dann auszuführen, wenn der erste erfolgreich war.
  • ls ~: Listet den Inhalt Ihres Home-Verzeichnisses auf (das Symbol ~ steht für Ihr Home-Verzeichnis).

Geben Sie diesen Befehl in Ihr Terminal ein und drücken Sie die Eingabetaste. Sie sollten das heutige Datum gefolgt von einer Liste der Dateien und Ordner in Ihrem Home-Verzeichnis sehen.

Falls nach dem Datum keine Dateien aufgelistet werden, keine Sorge! Das könnte bedeuten, dass Ihr Home-Verzeichnis leer ist. Sie können stattdessen ls /home/labex versuchen, um sicherzustellen, dass Sie eine Ausgabe erhalten.

Bedingte Befehlsausführung

In diesem Schritt untersuchen wir, wie man bedingte Operatoren verwendet, um die Befehlsausführung basierend auf dem Erfolg oder Misserfolg vorheriger Befehle zu steuern.

Versuchen wir zunächst, einen bedingten Befehl mit einem nicht installierten Programm auszuführen:

which cowsay && cowsay "Hello, LabEx" || echo "cowsay is not installed"

In dieser Befehlssequenz passiert Folgendes:

  • which cowsay prüft, ob das Programm cowsay installiert ist.
  • && ist ein logischer UND-Operator, der den nächsten Befehl nur ausführt, wenn der vorherige erfolgreich war.
  • cowsay "Hello, LabEx" zeigt eine ASCII-Art-Kuh an, die "Hello, LabEx" sagt.
  • || ist ein logischer ODER-Operator, der den nächsten Befehl nur ausführt, wenn der vorherige Befehl fehlgeschlagen ist.
  • echo "cowsay is not installed" gibt eine Nachricht aus, die darauf hinweist, dass cowsay nicht installiert ist.

Sie sollten die Ausgabe "cowsay is not installed" sehen, da das Programm cowsay noch nicht auf dem System installiert ist.

Installieren wir nun cowsay:

sudo apt-get update && sudo apt-get install -y cowsay

und führen den gleichen Befehl erneut aus:

which cowsay && cowsay "Hello, LabEx" || echo "cowsay is not installed"

Diesmal sollten Sie eine ASCII-Art-Kuh sehen, die "Hello, LabEx" sagt.

Dieses Beispiel demonstriert, wie man && und || verwendet, um bedingte Befehlssequenzen zu erstellen. && bedeutet "ausführen, wenn der vorherige Befehl erfolgreich war", während || bedeutet "ausführen, wenn der vorherige Befehl fehlgeschlagen ist".

Schlüsseln wir auf, was passiert ist:

  1. Vor der Installation:

    • which cowsay schlug fehl, da cowsay nicht installiert war.
    • Da die linke Seite von && fehlschlug, wurde cowsay "Hello, LabEx" nicht ausgeführt.
    • Der fehlgeschlagene Ausdruck which cowsay && cowsay "Hello, LabEx" löste || aus, sodass echo "cowsay is not installed" ausgeführt wurde.
  2. Nach der Installation:

    • which cowsay war erfolgreich, also wurde cowsay "Hello, LabEx" ausgeführt.
    • Der Befehl nach || musste nicht mehr ausgeführt werden.

Versuchen Sie, Ihre eigenen bedingten Befehlssequenzen mit diesen Operatoren zu erstellen!

Einführung in Pipelines

Pipelines sind eine leistungsstarke Funktion unter Linux, mit der Sie die Ausgabe eines Befehls mit der Eingabe eines anderen verbinden können. Dies geschieht mithilfe des | (Pipe)-Symbols.

Beginnen wir mit einem einfachen Beispiel:

ls -l /etc | less

Hier ist die Erklärung:

  • ls -l /etc: Listet den Inhalt des Verzeichnisses /etc im Langformat auf.
  • |: Leitet die Ausgabe des vorherigen Befehls an den nächsten Befehl weiter.
  • less: Ein Programm, mit dem Sie durch Text scrollen können.

Wenn Sie dies ausführen, sehen Sie eine Liste von Dateien und Verzeichnissen. Sie können die Pfeiltasten nach oben und unten verwenden, um zu scrollen, und 'q' drücken, um das Programm zu beenden.

Versuchen wir nun eine komplexere Pipeline:

ls -l /etc | grep '^d' | wc -l

Dieser Befehl zählt die Anzahl der Verzeichnisse in /etc. So funktioniert es:

  1. ls -l /etc: Listet den Inhalt von /etc im Langformat auf.
  2. grep '^d': Filtert nach Zeilen, die mit 'd' beginnen (was auf Verzeichnisse hinweist).
  3. wc -l: Zählt die Anzahl der Zeilen (was nun der Anzahl der Verzeichnisse entspricht).

Sie sollten eine Zahl sehen, die der Anzahl der Verzeichnisse in /etc entspricht.

Felder extrahieren mit cut

Der Befehl cut ist nützlich, um bestimmte Teile jeder Zeile einer Datei zu extrahieren. Wir verwenden ihn, um Benutzernamen und Home-Verzeichnisse aus der Datei /etc/passwd zu extrahieren, die Informationen über Benutzerkonten auf dem System enthält.

Führen Sie diesen Befehl aus:

cut -d: -f1,6 /etc/passwd | head -n 5

Schlüsseln wir das auf:

  • cut: Der Befehl zum Extrahieren von Zeilenteilen.
  • -d:: Verwendet : als Trennzeichen (das Zeichen, das Felder voneinander trennt).
  • -f1,6: Extrahiert das 1. und 6. Feld (Benutzername und Home-Verzeichnis).
  • |: Leitet die Ausgabe an den nächsten Befehl weiter.
  • head -n 5: Zeigt nur die ersten 5 Zeilen der Ausgabe an.

Sie sollten eine Ausgabe ähnlich dieser sehen:

root:/root
daemon:/usr/sbin
bin:/bin
sys:/dev
sync:/bin

Jede Zeile zeigt einen Benutzernamen und das zugehörige Home-Verzeichnis, getrennt durch einen Doppelpunkt.

Kombination von grep mit Pipelines und Befehlssequenzen

In diesem Schritt untersuchen wir, wie man grep in Kombination mit Pipelines und Befehlssequenzen für eine fortgeschrittene Textverarbeitung verwendet.

Beginnen wir damit, alle Zeilen zu suchen, die "PATH" in Ihrer .zshrc-Datei enthalten, und diese zu zählen:

grep "PATH" ~/.zshrc | wc -l

Diese Pipeline verwendet zuerst grep, um Zeilen mit "PATH" zu finden, und leitet die Ausgabe dann an wc -l weiter, um die Zeilen zu zählen.

Verwenden wir nun eine Befehlssequenz, um zu prüfen, ob "PATH" existiert, und zeigen dann nur dann Zeilen mit "HOME" an, wenn diese erste Prüfung erfolgreich war:

grep -q "PATH" ~/.zshrc && grep "HOME" ~/.zshrc

Die Option -q sorgt dafür, dass der erste grep im Hintergrund (quiet) läuft, sodass er auf Übereinstimmungen prüft, ohne die "PATH"-Zeilen auszugeben. Wenn der erste Befehl erfolgreich ist, gibt der zweite grep die Zeilen aus, die "HOME" enthalten.

Versuchen wir ein komplexeres Beispiel. Wir suchen nach Zeilen, die "bin" in /etc/passwd enthalten, sortieren sie und zeigen die ersten 5 an:

grep "bin" /etc/passwd | sort | head -n 5

Diese Pipeline führt drei Schritte aus:

  1. Findet Zeilen, die "bin" enthalten.
  2. Sortiert diese Zeilen alphabetisch.
  3. Zeigt nur die ersten 5 Zeilen des Ergebnisses an.

Kombinieren wir schließlich alles, was wir gelernt haben. Wir suchen nach Zeilen, die "sh" in /etc/passwd enthalten, zählen sie und zeigen basierend auf der Anzahl entweder die Zeilen oder eine Nachricht an:

grep "sh" /etc/passwd | wc -l | {
  read count
  [ $count -gt 5 ] && grep "sh" /etc/passwd || echo "Found $count lines, not enough to display."
}

Dieser komplexe Befehl bewirkt Folgendes:

  1. Sucht nach Zeilen, die "sh" enthalten.
  2. Zählt diese Zeilen.
  3. Wenn die Anzahl größer als 5 ist, werden die Zeilen angezeigt.
  4. Wenn die Anzahl 5 oder weniger beträgt, wird eine Nachricht mit der Anzahl angezeigt.

Hinweis: Wenn Sie mehrzeilige Befehle im Terminal eingeben, müssen Sie möglicherweise nach jeder Zeile (außer der letzten) Alt+Enter drücken, um Zeilenumbrüche zu erzeugen, oder den gesamten Befehl einfach in einer einzigen Zeile eingeben.

Versuchen Sie, diese Befehle auszuführen und mit Ihren eigenen Kombinationen zu experimentieren!

Zählen mit wc

Der Befehl wc (word count) ist nützlich, um Zeilen, Wörter und Zeichen in Texten zu zählen.

Beginnen wir damit, die Anzahl der Zeilen in /etc/passwd zu zählen:

wc -l /etc/passwd

Die Option -l weist wc an, Zeilen zu zählen. Sie sollten eine Zahl gefolgt vom Dateinamen sehen.

Zählen wir nun die Anzahl der Wörter in den ersten 10 Zeilen von /etc/passwd:

head -n 10 /etc/passwd | wc -w

Diese Pipeline führt zwei Schritte aus:

  1. head -n 10 /etc/passwd: Holt die ersten 10 Zeilen der Datei.
  2. wc -w: Zählt die Wörter in diesen Zeilen.

Sie sollten eine Zahl sehen, die die Wortanzahl darstellt.

Sortieren mit sort

Der Befehl sort wird verwendet, um Textzeilen zu sortieren. Verwenden wir ihn, um die Datei /etc/passwd nach dem dritten Feld (Benutzer-ID) zu sortieren:

sort -t: -k3 -n /etc/passwd | head -n 5

Hier ist die Erklärung der einzelnen Teile:

  • -t:: Verwendet : als Feldtrennzeichen.
  • -k3: Sortiert basierend auf dem dritten Feld.
  • -n: Sortiert numerisch (statt alphabetisch).
  • | head -n 5: Zeigt nur die ersten 5 Zeilen der Ausgabe an.

Sie sollten die ersten fünf Zeilen von /etc/passwd sehen, sortiert nach der Benutzer-ID (dem dritten Feld).

Duplikate entfernen mit uniq

Der Befehl uniq wird verwendet, um doppelte Zeilen in sortiertem Text zu entfernen oder zu identifizieren. Verwenden wir ihn, um eindeutige Shell-Typen in /etc/passwd zu finden:

cut -d: -f7 /etc/passwd | sort | uniq

Diese Pipeline führt drei Schritte aus:

  1. cut -d: -f7 /etc/passwd: Extrahiert das 7. Feld (die Shell) aus jeder Zeile.
  2. sort: Sortiert die Zeilen alphabetisch.
  3. uniq: Entfernt doppelte Zeilen.

Sie sollten eine Liste der eindeutigen Shell-Pfade sehen, die auf dem System verwendet werden.

Zählen wir nun, wie viele Benutzer jede Shell verwenden:

cut -d: -f7 /etc/passwd | sort | uniq -c

Die Option -c stellt den Zeilen die Anzahl der Vorkommen voran. Sie sollten jeden Shell-Pfad sehen, dem eine Zahl vorangestellt ist, die angibt, wie viele Benutzer diese Shell verwenden.

Zusammenfassung

Herzlichen Glückwunsch! Sie haben dieses Lab zur Linux-Befehlsausführung und Textverarbeitung abgeschlossen. Fassen wir zusammen, was Sie gelernt haben:

  1. Sie können Befehle sequenziell mit && und bedingt mit || ausführen.
  2. Pipelines (|) ermöglichen es Ihnen, mehrere Befehle zu verbinden, indem die Ausgabe eines Befehls als Eingabe für den nächsten dient.
  3. cut eignet sich hervorragend zum Extrahieren bestimmter Teile von Zeilen in einer Datei.
  4. grep hilft Ihnen bei der Suche nach bestimmten Mustern in Texten.
  5. wc kann Zeilen, Wörter und Zeichen in Texten zählen.
  6. sort ordnet Textzeilen in einer bestimmten Reihenfolge an.
  7. uniq entfernt Duplikate aus sortiertem Text und kann Vorkommen zählen.

Diese Werkzeuge sind grundlegend für die Textverarbeitung unter Linux. Auf Ihrem weiteren Weg mit Linux werden Sie unzählige Möglichkeiten finden, diese Befehle zu kombinieren, um komplexe Textverarbeitungsaufgaben zu lösen. Scheuen Sie sich nicht, zu experimentieren und neue Kombinationen auszuprobieren!

Denken Sie daran: Übung macht den Meister. Versuchen Sie, diese Befehle mit verschiedenen Dateien und Optionen zu verwenden, um Ihr Verständnis zu vertiefen. Wenn Sie einmal vergessen, wie ein Befehl funktioniert, können Sie jederzeit den Befehl man (z. B. man grep) verwenden, um die entsprechende Handbuchseite aufzurufen.

Lernen Sie weiter und viel Spaß mit Linux!