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

Arbeiten mit Pipes auf der Linux-Befehlszeile

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 oder cmd1 < 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.“

enthält

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.


Linux
  1. So verwenden Sie den Linux-Grep-Befehl

  2. Kopieren und Einfügen in der Linux-Befehlszeile mit xclip

  3. Haben Sie eine Kuh an der Linux-Befehlszeile

  4. Boxen Sie sich auf der Linux-Befehlszeile ein

  5. Verwenden Sie den Linux-Befehl grep

Meistern Sie die Linux-Befehlszeile

Bearbeiten von Text in der Befehlszeile mit grep

Arbeiten mit Docker-Images über die Befehlszeile

Grep-Befehl in Linux (mit Beispielen)

Verwendung des grep-Befehls unter Linux

Grundlagen der Linux-Befehlszeile – Arbeiten mit Dateien und Verzeichnissen