Es tut mir leid, Ihnen mitteilen zu müssen, aber die Befehlszeile ist nicht mit den Dinosauriern ausgestorben, noch ist sie mit dem Dodo oder der Brieftaube verschwunden. Die Linux-Befehlszeile lebt und ist gesund und funktioniert immer noch gut. Es ist eine effiziente Möglichkeit, Informationen schnell zu sammeln und zu verarbeiten, neue Skripts zu erstellen und Systeme zu konfigurieren.
Einer der mächtigsten Shell-Operatoren ist die Pipe (|
). Die Pipe nimmt die Ausgabe von einem Befehl und verwendet sie als Eingabe für einen anderen. Und Sie sind nicht auf einen einzelnen Pipe-Befehl beschränkt – Sie können sie so oft stapeln, wie Sie möchten, oder bis Ihnen die Ausgabe- oder Dateideskriptoren ausgehen.
Einer der Hauptzwecke von Rohrleitungen ist das Filtern. Sie verwenden Piping, um den Inhalt einer großen Datei zu filtern, um beispielsweise eine bestimmte Zeichenfolge oder ein bestimmtes Wort zu finden. Aus diesem Grund beinhaltet die beliebteste Verwendung für Pipes die Befehle grep
und sort
. Aber Sie sind nicht auf diese Fälle beschränkt. Sie können die Ausgabe an jeden Befehl weiterleiten, der Stream-Eingaben akzeptiert. Schauen wir uns ein theoretisches Beispiel an, um zu veranschaulichen, wie dieser Prozess funktioniert:
$ cmd1 | cmd2
Sowohl cmd1
und cmd2
sind Befehlszeilenprogramme, die ihre Ergebnisse auf dem Bildschirm ausgeben (stdout
). Wenn Sie jedoch die Ausgabe eines Befehls an einen anderen weiterleiten, werden die Informationen aus cmd1
erzeugt keine Ausgabe auf dem Bildschirm. Die Pipe leitet diese Ausgabe als Eingabe an cmd2
um .
Hinweis: Verwechseln Sie Pipe nicht (
|
) Umleitung mit Dateiumleitung (>
) und (<
). (Ein Beispiel für eine Dateiumleitung:cmd1 > file
odercmd1 < file
.) Die Dateiumleitung sendet die Ausgabe entweder an eine Datei statt an den Bildschirm oder zieht die Eingabe aus einer Datei.
Schauen wir uns einige Beispiele aus der Praxis an, wie Rohrleitungen funktionieren.
Netzwerkkarten überprüfen
Angenommen, Sie müssen wissen, ob eine Ihrer Netzwerkkarten (NICs) eine IP-Adresse hat, die mit 192 beginnt:
$ ifconfig | grep 192
inet 192.168.1.96 netmask 255.255.255.0 broadcast 192.168.1.255
Sie können auch mit einer einfachen Pipe zu grep
herausfinden, welche Live-NICs Sie auf einem System haben :
$ ifconfig | grep UP
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
Sie können auch nach "RUNNING" oder "RUN" suchen, um dieselben Informationen anzuzeigen.
Berechtigungen prüfen
Vielleicht möchten Sie herausfinden, wie viele Verzeichnisse unter /etc
sind von root beschreibbar:
$ sudo ls -lR | grep drwx
Die Ergebnisse sind zu lang, um sie hier aufzulisten, aber wie Sie Ihrer angezeigten Liste entnehmen können, gibt es viele davon. Sie müssen noch herausfinden, wie viele es sind, und eine visuelle Zählung würde lange dauern. Eine einfache Möglichkeit besteht darin, die Ergebnisse Ihrer ls
zu leiten Befehl an wc
(Wörter zählen) Befehl:
$ sudo ls -lR | grep drwx | wc -l
285
Das -l
Schalter zeigt die Anzahl der Zeilen an. Ihre Zählung kann anders sein. Diese Auflistung stammt von einer neuen „RHEL 8 Server No GUI“-Installation.
[Möchten Sie Red Hat Enterprise Linux ausprobieren? Jetzt kostenlos herunterladen.]
Dateien zählen
Sie müssen grep
nicht verwenden die ganze Zeit. Beispielsweise können Sie die Anzahl der Dateien in /etc
auflisten Verzeichnis mit diesem:
$ ls | wc -l
229
Auch hier sehen Ihre Ergebnisse möglicherweise anders aus, aber Sie wissen, dass etwas nicht stimmt, wenn der Befehl eine kleine Anzahl von Dateien zurückgibt.
Prozesse identifizieren
Sie können auch komplexe Aufgaben mit Pipes ausführen. Um die Prozess-IDs (PIDs) für alle systemd
aufzulisten -verwandte Prozesse:
$ ps -ef | grep systemd | awk '{ print $2 }'
1
471
500
608
631
7449
7494
17242
Das awk
$2
des Befehls Ausgabe isoliert die zweite (PID) Spalte von ps
Befehl. Beachten Sie, dass der letzte Eintrag PID 17242
, ist eigentlich die PID für grep
Befehl, der diese Informationen anzeigt, wie Sie den vollständigen Auflistungsergebnissen hier entnehmen können:
khess 17242 7505 0 09:40 pts/0 00:00:00 grep --color=auto systemd
Um diesen Eintrag aus Ihren Ergebnissen zu entfernen, verwenden Sie erneut den Pipe-Operator:
$ ps -ef | grep systemd | awk '{ print $2 }' | grep -v grep
Das -v
switch teilt dem grep
mit Befehl, um Zeilen zu invertieren oder zu ignorieren, die die folgende Zeichenfolge enthalten – in diesem Fall jede Zeile, die das Wort „grep.“
Ergebnisse sortieren
Eine weitere beliebte Verwendung des Pipe-Operators ist das Sortieren Ihrer Ergebnisse durch Weiterleiten an sort
Befehl. Angenommen, Sie möchten die Liste der Namen in contacts.txt
sortieren . Schauen wir uns zuerst den Inhalt an, wie er in der Datei ist, bevor wir ihn sortieren:
$ cat contacts.txt
Bob Jones
Leslie Smith
Dana David
Susan Gee
Leonard Schmidt
Linda Gray
Terry Jones
Colin Doe
Jenny Case
Sortieren Sie nun die Liste:
$ cat contacts.txt | sort
Bob Jones
Colin Doe
Dana David
Jenny Case
Leonard Schmidt
Leslie Smith
Linda Gray
Susan Gee
Terry Jones
Mit dem -r
können Sie die Sortierreihenfolge umkehren Schalter:
$ cat contacts.txt | sort -r
Terry Jones
Susan Gee
Linda Gray
Leslie Smith
Leonard Schmidt
Jenny Case
Dana David
Colin Doe
Bob Jones
War die Ausgabe für beides so, wie Sie es erwartet hatten? Standardmäßig ist die sort
Der Befehl führt eine Wörterbuchsortierung nach dem ersten Wort oder der ersten Spalte durch, weshalb Bob Jones
und Terry Jones
werden nicht hintereinander aufgelistet.
Mit dem -k
können Sie nach der zweiten Spalte sortieren wechseln, indem Sie die Spalte angeben, nach der Sie sortieren möchten, was in unserer Liste die zweite Spalte ist:
$ cat contacts.txt | sort -k2
Jenny Case
Dana David
Colin Doe
Susan Gee
Linda Gray
Bob Jones
Terry Jones
Leonard Schmidt
Leslie Smith
Wenn Sie eine lange Kontaktliste haben und der Meinung sind, dass diese Liste doppelte Einträge enthält, können Sie Ihre Liste an sort
weiterleiten und dann uniq
um diese Duplikate zu entfernen:
$ cat contacts.txt | sort | uniq
Dieser Befehl zeigt nur eindeutige Einträge an, speichert die Ergebnisse jedoch nicht. Verwenden Sie Folgendes, um die Datei zu sortieren, eindeutige Einträge zu filtern und dann die neue Datei zu speichern:
$ cat contacts.txt | sort -k2 | uniq > contact_list.txt
Denken Sie daran, dass der Pipe-Operator und die Dateiumleitungsoperatoren unterschiedliche Dinge tun.
Abschluss
Jetzt, wo Sie einen Vorgeschmack auf die Leistungsfähigkeit der Befehlszeile bekommen haben, glauben Sie, dass Sie die Verantwortung übernehmen können? Befehlszeilenprogramme sind flexibler als ihre grafischen Gegenstücke. Und für einige Aufgaben gibt es keine grafische Entsprechung.
Der beste Weg, um das Verhalten der Befehlszeile zu lernen, ist zu experimentieren. Zum Beispiel die sort
Befehl hat nicht das getan, was Sie dachten, bis Sie weiter nachgeforscht haben. Vergessen Sie nicht, die Kraft Ihres Handbuchs zu nutzen (man
)-Seiten, um diese "versteckten" geheimen Schalter und Optionen zu finden, die die Frustration der Befehlszeile in einen Erfolg auf der Befehlszeile verwandeln.