Diese 6 Linux-Pipelines sind überflüssig, komplex und ineffizient; so behebt man sie
Pipes sind eine sehr mächtige Kernfunktion von Linux. Indem man Programme miteinander verknüpft, kann man mit einer kleinen Anzahl an Werkzeugen komplexe Aufgaben ausführen. Doch Pipes sind nicht immer die beste Lösung; wenn sie nicht erforderlich sind, können sie die Komplexität erhöhen und zu weniger effizienten Ergebnissen führen.
Viele Linux-Befehle verfügen über Optionen, die es ihnen ermöglichen, die Aufgabe eines anderen Befehls zu übernehmen. Zum Beispiel kann „ls“ seine eigene Ausgabe sortieren - obwohl es den Befehl „sort“ gibt. Entdecken Sie, welche gängigen Befehlskombinationen bessere Alternativen haben und wie Sie diese nutzen können.
grep | wc
Der Pipeline-Mechanismus ist üblich, aber grep hat seinen eigenen Zähler.
Dieses Muster kommt sehr häufig vor - unter anderem, weil es eine hervorragende Demonstration für den Einsatz von „wc“ ist. Das „Wortzähler“-Tool, das auch Zeilen und Zeichen zählen kann, passt gut in viele Pipelines, da man sich meist eher für die Anzahl der Ergebnisse als für deren Inhalt interessiert:
grep -E "^.+() {$" funcs.sh | wc -l
Während „wc“ die Anzahl der Ergebnisse perfekt zählt, kann „grep“ dies selbst mit der Option „-c“ bzw. „--count“ erledigen.
grep --count -E "^.+() {$" funcs.sh
Die Option -c war anscheinend schon von Anfang an eine Funktion von grep - daher gab es eigentlich nie einen Grund, warum dieses Muster sich durchsetzen sollte.
cat Datei | alles
Eine nutzlose Verwendung von „cat“, die leicht vermieden werden kann.
Eine weitere äußerst häufige, aber vermeidbare Verwendung einer Pipeline. Der Befehl `cat` ist nützlich - denn obwohl er für „verketten“ steht, muss er eigentlich nichts zusammenfügen. Standardmäßig schreibt er eine Datei auf die Standardausgabe - selbst wenn es sich nur um eine einzelne Datei handelt.
Das bedeutet, dass es oft verlockend ist, `cat` zu verwenden, wenn man den Inhalt einer Datei als Eingabe für einen anderen Befehl verwenden möchte:
cat file > wc -l
Aber ein Befehl wie `wc` liest die Eingabe aus jedem Datei-Argument, das Sie ihm übergeben - daher ist das Umleiten über `cat` nicht notwendig:
wc -l file
Aber was, wenn ein Befehl keine Datei-Argumente unterstützt? Dann muss man doch „cat“ verwenden, oder? Eigentlich nicht: Linux verfügt über einen integrierten Operator zur Dateiumleitung - dadurch ist „cat“ auch in solchen Fällen überflüssig.
tr ' ' '\n' <filename
Es braucht etwas Zeit, sich daran zu gewöhnen - besonders wenn das Pipen von „cat“ bereits in Ihrem Muskelgedächtnis verankert ist - doch das Erlernen einer effektiven Umleitung eröffnet Ihnen eine Vielzahl von Möglichkeiten in der Kommandozeile.
ls | sort
Eine integrierte Sortierung bietet neue Vorteile
Der Befehl sort ist ein weiterer Befehl, der perfekt für das Pipelining geeignet ist: Es handelt sich um einen Filter, der - wie zu erwarten - alle eingehenden Daten sortiert und sie an die Standardausgabe weitergibt.
Für Befehle wie „ls“, die eine Ausgabe in nahezu tabellarischer Form erzeugen können, ist das also sehr nützlich. Tatsächlich macht die Option „-k“ von „sort“, mit der die Nummer des Feldes angegeben wird, nach dem sortiert werden soll, das Tool für diesen Zweck äußerst vielseitig einsetzbar.
Dennoch besteht eigentlich keine Notwendigkeit, es zu verwenden - zumindest nicht im Fall von „ls“, das seine eigene Option zum Sortieren nach Dateigröße bereitstellt:
ls -lrS
Die Option -r kehrt die Sortierrichtung um, sodass die größten Dateien am Ende stehen - was wahrscheinlich das ist, was Sie wollen.
Die Verwendung des in „ls“ integrierten Sortierers hat noch einen kleinen, aber wichtigen Vorteil. Wenn man die Ausgabe von „ls“ an „sort“ weiterleitet, gehen alle Farbformatierungen verloren; der in „ls“ integrierte Sortierer bewahrt diese jedoch bei.
Kopf | Schwanz
Einen Bereich von Zeilen mit einem einzigen Befehl extrahieren
Die Befehle `head` und `tail` eignen sich hervorragend, um jeweils die ersten oder letzten n Zeilen der Eingabe zu extrahieren. Zusammen bilden sie eine praktische Methode, um einen bestimmten Zeilenbereich aus einer Datei herauszufiltern:
<filename head -105 | tail -4
Es ist clever, aber man kann dasselbe mit sed, dem Stream-Editor, erreichen:
sed -n '102,105p' <filename
Beachten Sie, dass sowohl dieser Befehl als auch die vorherige Pipeline die Zeilen 102-105 aus der Datei abrufen, doch die sed-Version erfordert weniger Rechenoperationen.
grep | head
Halten Sie große Ergebnismengen übersichtlich und ersparen Sie grep die zusätzliche Arbeit.
Manchmal liefert Ihr grep nur ein Ergebnis, manchmal Hunderte oder sogar mehr. Wenn Sie mit einer großen Menge an grep-Ausgaben zu tun haben, ist es naheliegend, erneut den `head`-Befehl zu verwenden, um nach einer bestimmten Anzahl von Zeilen aufzuhören:
grep firefox access_log | head -n 10
Das ist jedoch unnötig, dank der -m (--max-count)-Option von grep, die genau dasselbe bewirkt:
grep --max-count=10 firefox access_log
sort | uniq
Eine klassische Pipeline mit einem Befehl weniger
Hier ist noch eine Pipeline, die man sehr häufig sieht; man würde annehmen, dass sie der beste - vielleicht sogar der einzige - Weg ist, Datenzeilen zu sortieren und zu deduplizieren:
sort <urls | uniq
Aber es gibt eine andere Möglichkeit - ohne den seltsam benannten Befehl „uniq“ überhaupt zu verwenden. Der Befehl „sort“ verfügt über eine eingebaute Option zur Entfernung doppelter Zeilen, nämlich „-u“ (--unique):
sort --unique <urlsBedenken Sie immer die Alternativen.
Linux ist ein flexibles System, das zahlreiche kleine Werkzeuge bietet, die man kombinieren kann, um verschiedene Aufgaben zu erledigen. Dies gewährt Ihnen große Flexibilität - probieren Sie daher unbedingt andere Vorgehensweisen aus, verstehen Sie die Unterschiede und seien Sie bereit, neue Ansätze zu lernen.







