Wie Verwenden von Pipes unter Linux

0
611
Fatmawati Achmad Zaenuri/Shutterstock.com

Der Einsatz von Linux-Rohre zu choreographieren, wie Befehlszeilen-Dienstprogramme arbeiten. Vereinfachen Sie komplexe Prozesse und steigern Sie Ihre Produktivität durch die Nutzung eine Sammlung von eigenständigen Befehlen und drehen Sie Sie in einem zielstrebigen team. Wir zeigen Ihnen, wie.

Die Rohre Sind Überall

Pipes sind eine der nützlichsten command-line-Funktionen, Linux-und Unix-ähnliche Betriebssysteme haben. Die Rohre sind in unzähligen Arten. Blick auf Linux-Befehlszeilen-Artikel—auf einer beliebigen Website, die nicht nur von uns—und Sie werden sehen, dass die Rohre einen Auftritt mehr als oft nicht. Ich überprüfte einige How-To-Geek-Linux-Artikel, und die Rohre sind in allen von Ihnen, eine oder andere Weise.

Linux-Rohre ermöglichen es dir, Aktionen auszuführen, die nicht unterstützt out-of-the-box von der shell. Aber da der Linux-design-Philosophie ist es, viele kleine Dienstprogramme, die Sie durchführen, Ihre dedizierte Funktion sehr gut, und ohne unnötige Funktionen—das “eine Sache zu tun und es gut tun” – mantra—Sie können plumb Zeichenfolgen von Befehlen, die zusammen mit Rohren, so dass die Ausgabe eines Befehls wird zur Eingabe eines anderen. Jeder Befehl, den Sie Rohr-in bringt seine einzigartigen Talente zum team, und bald finden Sie, Sie haben montiert eine gewinnende Mannschaft.

Ein Einfaches Beispiel

Nehmen wir an, wir haben ein Verzeichnis voll von vielen verschiedenen Arten von Datei. Wir wollen wissen, wie viele Dateien eines bestimmten Typs in diesem Verzeichnis. Es gibt andere Wege, dies zu tun, aber das Ziel dieser übung ist das einführen der Rohre, so dass wir es zu tun mit Rohren.

Wir können eine Liste der Dateien, die einfach mit ls:

ls

Trennen Sie den Datei-Typ von Interesse, wir werden mit grep. Wir wollen, um Dateien zu finden, die das Wort “Seite” in Ihrem Dateinamen oder die Dateierweiterung.

Wir verwenden die shell-Sonderzeichen “|” pipe die Ausgabe von ls in grep.

ls | grep “page”

grep-druckt Linien, die mit dem Suchmuster. So das gibt uns eine Liste mit nur “.Seite” Dateien.

Selbst dieses triviale Beispiel zeigt die Funktionalität von Rohren. Die Ausgabe von ls nicht gesendet wurde, um das terminal-Fenster. Es wurde geschickt, um grep als Daten für den grep-Befehl, mit zu arbeiten. Die Ausgabe, die wir sehen kommt von grep, das ist der Letzte Befehl in dieser Kette.

Die Erweiterung Unserer Wertschöpfungskette

Wir beginnen den ausbau unserer chain-of-Pipe-Befehle. Zählen wir die “.Seite” Dateien durch hinzufügen der wc-Befehl. Wir verwenden die -l (line count) option mit wc. Hinweis: wir haben auch Hinzugefügt, die -l (long format) option zu ls . Wir werden dazu in Kürze.

ls – | grep “page” | wc -l

grep ist nicht mehr der Letzte Befehl in der Kette, so dass wir nicht sehen, seine Ausgabe. Die Ausgabe von grep ist gefüttert in den wc-Befehl. Die Ausgabe, die wir sehen, in das terminal-Fenster ist vom wc. wc-Berichte, die gibt es 69 “.Seite” Dateien in das Verzeichnis.

Wir erweitern die Dinge wieder. Nehmen wir den wc-Befehl aus der Kommandozeile, und ersetzen Sie es mit awk. Es gibt neun Spalten in der Ausgabe von ls mit der -l (long format) option. Wir verwenden awk zu Spalten fünf, drei und neun. Diese sind die Größe, den Besitzer, und den Namen der Datei.

ls -l | grep “page” | awk ‘{print $5 “”$3 “” $9}’

Wir erhalten eine Liste der Spalten, für jeden die passenden Dateien.

Wir werden uns nun passieren, dass die Ausgabe über den Befehl “Sortieren”. Wir werden die-n (numeric) option zum Sortieren lassen weiß ersten Säule behandelt werden sollten als zahlen.

ls -l | grep “page” | awk ‘{print $5 “”$3 “” $9}’ | sort-n

Die Ausgabe ist jetzt sortiert in die Datei Größe um, mit unseren individuellen Auswahl von drei Spalten.

Hinzufügen Von Einem Anderen Befehl

Wir werden ausklingen, indem Sie den tail-Befehl. Wir sagen es, um eine Liste der letzten fünf Zeilen der Ausgabe nur.

ls -l | grep “page” | awk ‘{print $5 “”$3 “” $9}’ | sort-n | tail -5

Das bedeutet, unser Befehl übersetzt so etwas wie “zeige mir die fünf größten “.Seite” Dateien in diesem Verzeichnis, sortiert nach Größe.” Natürlich, es gibt keinen Befehl um das zu erreichen, aber durch die Verwendung von Rohren, wir haben unsere eigenen. Wir könnten hinzufügen, die in diesem—oder einem anderen langen Befehl—wie ein alias oder ein shell-Funktion zum speichern der Eingabe.

Hier ist die Ausgabe:

Wir könnten Umgekehrt die Größe, um durch das hinzufügen des-r – (reverse) – option, um den Befehl “Sortieren”, und mit head statt tail wählen Sie die Zeilen von oben der Ausgang.

Dieser Zeit zu den fünf größten “.Seite” Dateien gelistet werden, vom größten zum kleinsten:

Einige Aktuelle Beispiele

Hier sind zwei interessante Beispiele aus den letzten How-To-geek-Artikeln.

Einige Befehle, wie der xargscommand, sind entworfen, um input an Ihnen. Hier ist ein Weg, wir haben wc Anzahl der Wörter, Zeichen und Zeilen in mehreren Dateien, durch Leitungen, ls in xargs, die speist dann die Liste der Dateinamen zu wc, als hätten Sie bestanden auf wc als Kommandozeilen-Parameter.

ls *.Seite | xargs wc

Die Gesamtzahl der Wörter, Zeichen und Linien sind aufgeführt auf der Unterseite des terminal-Fenster.

Hier ist ein Weg, um eine sortierte Liste von eindeutigen Dateierweiterungen im aktuellen Verzeichnis, mit einer Anzahl von jedem Typ.

ls | rev | cut-d’.’ -f1 | rev | sort | uniq -c

Es gibt eine Menge Los hier.

  • ls: Listet die Dateien in das Verzeichnis
  • rev: Kehrt der text in den Dateinamen.
  • Ausschneiden: Schneidet die Zeichenfolge beim ersten auftreten des angegebenen Trennzeichens “.”. Text nach dieser verworfen wird.
  • rev: Kehrt die restliche text, das ist der Dateinamen-Erweiterung.
  • Sortieren: Sortiert die Liste alphabetisch.
  • uniq: Zählt die Anzahl von jeder eindeutigen Eintrag in der Liste.

Die Ausgabe zeigt die Liste der Datei-Erweiterungen, alphabetisch sortiert, mit einem Zähler für jede eindeutige Typ.

Named Pipes

Es gibt eine andere Art von Rohr zur Verfügung zu uns, die sogenannten named pipes. Die Rohre in den vorherigen Beispielen erstellt werden on-the-fly von der shell beim verarbeiten der Befehlszeile. Die Rohre werden erstellt, verwendet und anschließend verworfen. Sie sind vergänglich und lassen keine Spur von sich. Sie existieren nur so lange, wie der Befehl mit Ihnen ausgeführt wird.

Named pipes erscheinen als persistente Objekte in das Dateisystem, so können Sie sehen, wie Sie mit ls. Sie sind hartnäckig, weil Sie überleben einen Neustart des Computers—obwohl keine ungelesenen Daten, die in Ihnen in dieser Zeit verworfen werden.

Named pipes verwendet wurden, eine Menge zu einer Zeit, zu erlauben, verschiedene Prozesse zu senden und Daten empfangen, aber ich habe nicht gesehen, dass Sie verwendet diese Weise für eine lange Zeit. Kein Zweifel, es gibt Leute da draußen, die immer noch mit Ihnen zum großen Effekt, aber ich habe keine aufgetreten, vor kurzem. Aber der Vollständigkeit halber, oder einfach nur Ihre Neugier zu befriedigen, hier ist, wie Sie Sie verwenden können.

Named pipes werden erzeugt mit dem Befehl mkfifo. Dieser Befehl erstellt eine named pipe als “geek-pipe” – in das aktuelle Verzeichnis.

mkfifo-geek-Rohr

Wir können sehen, die details der named pipe verwenden wir den Befehl ls mit der -l (long format) option:

ls -l geek-Rohr

Das erste Zeichen der Liste ist ein “p”, was bedeutet, es ist ein Rohr. Wenn es ein “d”, es würde bedeuten, dass die Datei-system-Objekt ein Verzeichnis ist, und einem Bindestrich “-” würde bedeuten, es ist eine reguläre Datei.

Mit der Named Pipe

Benutzen wir unser Rohr. Die Unbenannte pipes, die wir bei unseren bisherigen Beispielen bestanden die Daten sofort von der sende-Befehl an das empfangende Befehl. Daten, die gesendet werden über eine named pipe wird im Rohr bleiben, bis es gelesen wird. Die Daten im Speicher gehalten, so dass die Größe der named pipe nicht variieren in ls listings, ob Daten vorhanden sind oder nicht.

Wir verwenden zwei terminal-Fenster für dieses Beispiel. Ich verwende die Bezeichnung:

# Terminal-1

in einem terminal-Fenster und

# Terminal-2

in der anderen, so können Sie zwischen Ihnen zu differenzieren. Die Raute “#” sagt der shell, dass das, was folgt, ist ein Kommentar, und es zu ignorieren.

Nehmen wir die Gesamtheit unserer vorherigen Beispiel und umleiten, die in die named pipe. Wir sind also mit beiden unnamed und named pipes in einem Befehl:

ls | rev | cut-d’.’ -f1 | rev | sort | uniq -c > geek-Rohr

Nichts erscheint zu passieren. Sie können feststellen, dass Sie nicht bekommen, an die Eingabeaufforderung zurückgegeben, obwohl, so etwas passiert.

In den anderen terminal-Fenster, geben Sie den folgenden Befehl ein:

cat < geek-Rohr

Wir sind die Umleitung der Inhalt der named pipe, in die Katze, also die Katze zeigt, dass der Inhalt in der zweiten terminal-Fenster. Hier ist die Ausgabe:

Und Sie werden sehen, dass Sie zurück zu der Eingabeaufforderung in der ersten terminal-Fenster.

So, was gerade passiert ist.

  • Wir umgeleitet, die eine Ausgabe in die benannte pipe.
  • Der erste terminal-Fenster nicht zur Eingabeaufforderung zurückzukehren.
  • Die Daten blieben in der Leitung, bis es gelesen wurde aus dem Rohr in den zweiten terminal.
  • Wir sind wieder die Eingabeaufforderung in der ersten terminal-Fenster.

Sie werden vielleicht denken, dass Sie könnte ausführen des Befehls in der ersten terminal-Fenster als hintergrund-task, indem ein & am Ende des Befehls. Und Sie haben Recht. In diesem Fall würden wir wieder in der Eingabeaufforderung den Befehl sofort.

Der Punkt, der nicht mit der Hintergrundverarbeitung war zu betonen, dass eine named pipe ist ein blockierender Prozess. Wenn man etwas in eine named pipe öffnet sich nur ein Ende der Leitung. Das andere Ende ist nicht geöffnet, bis die Lesung Programm extrahiert die Daten. Der kernel unterbricht den Prozess in der ersten terminal-Fenster, bis das Lesen der Daten vom anderen Ende der Leitung.

Die Macht der Rohre

Heute, named pipes sind so etwas wie eine Neuheit wirken.

Plain old Linux-Rohre, auf der anderen Seite, sind eine der nützlichsten Werkzeuge, die Sie in Ihren terminal window toolkit. Der Linux-Kommandozeile gestartet wird lebendig für Sie, und Sie bekommen einen ganz neuen power-up, wenn Sie inszenieren eine Sammlung von Befehlen zum erzeugen einer zusammenhängenden Leistung.

Abschied Hinweis: Es ist am besten schreiben Sie Ihre Pipe-Befehle, indem Sie einen Befehl zu einer Zeit und bekommen, dass das Teil funktioniert, dann Paspeln in den nächsten Befehl.

LESEN SIE WEITER

  • › Warum muss USB Haben, So Kompliziert zu Sein?
  • › Was Sollten Sie Tun, Wenn Sie eine Phishing-E -?
  • › Warum Haben Sie sich Bei Ihrem PC zu Hause, Eh?
  • › Die Besten Neuen Funktionen im Android 10 Jetzt Verfügbar
  • › Wie Nutzen Sie das chown-Kommando auf Linux