Wenn Sie jemandem helfen würden, das Konzept der Pipes in der Befehlszeile zu erlernen, welches Beispiel würden Sie verwenden? Das tatsächlich aufgetauchte Beispiel war wie folgt:
cat whatever.txt | less
Ich denke, das ist nicht das beste Beispiel, weil es nur einen Schritt gibt. Was ist eine gute, aber fundamentale Verwendung von |
?
Im Idealfall werden in dem von mir vorgestellten Beispiel Programme verwendet, die selbst Ausgaben haben, die unabhängig voneinander ausgeführt und dann zusammen weitergeleitet werden können.
command-line
pipe
Matthew
quelle
quelle
cat
, dasless whatever.txt
funktioniert prima.Antworten:
Ich werde Sie durch ein etwas komplexes Beispiel führen, das auf einem realen Szenario basiert.
Problem
Angenommen, der Befehl
conky
reagiert auf meinem Desktop nicht mehr und ich möchte ihn manuell beenden. Ich kenne ein bisschen Unix, also weiß ich, dass ich den Befehl ausführen musskill <PID>
. Um die PID abzurufen, kann ich verwendenps
odertop
oder was auch immer Werkzeug meiner Unix - Distribution mir gegeben hat. Aber wie kann ich das mit einem Befehl machen?Antworten
HAFTUNGSAUSSCHLUSS: Dieser Befehl funktioniert nur in bestimmten Fällen. Kopieren Sie es nicht in Ihr Terminal und fangen Sie nicht an, es könnte Prozesse ahnungslos abbrechen. Lerne lieber, wie man es baut .
Wie es funktioniert
1-
ps aux
Dieser Befehl gibt die Liste der ausgeführten Prozesse und einige Informationen dazu aus. Die interessante Info ist, dass es die PID jedes Prozesses in seiner 2. Spalte ausgibt. Hier ist ein Auszug aus der Ausgabe des Befehls auf meiner Box:
2-
grep conky
Ich interessiere mich nur für einen Prozess, daher suche ich
grep
den Eintrag, der meinem Programm entsprichtconky
.3-
grep -v grep
Wie Sie in Schritt 2 sehen können, gibt der Befehl
ps
dengrep conky
Prozess in seiner Liste aus (es ist immerhin ein laufender Prozess). Um es zu filtern, kann ich laufengrep -v grep
. Die Option-v
sagtgrep
alle Linien passen ohne diejenigen , die Muster enthalten.NB: Ich würde gerne wissen, wie Sie die Schritte 2 und 3 in einem einzigen
grep
Anruf ausführen können.4-
awk '{print $2}'
Jetzt habe ich meinen Zielprozess isoliert. Ich möchte die PID abrufen. Mit anderen Worten, ich möchte das 2. Wort der Ausgabe abrufen. Glücklicherweise bieten die meisten (alle?) Modernen Unices eine Version von
awk
, einer Skriptsprache, die mit tabellarischen Daten Wunder vollbringt. Unsere Aufgabe wird so einfach wieprint $2
.5-
xargs kill
Ich habe die PID. Ich muss es nur weitergeben
kill
. Dazu werde ich verwendenxargs
.xargs kill
liest aus der Eingabe (in unserem Fall aus der Pipe), bildet einen Befehl , der auskill <items>
(<items>
was auch immer aus der Eingabe gelesen wird) besteht, und führt dann den erstellten Befehl aus. In unserem Fall wird es ausgeführtkill 1948
. Mission erfüllt.Letzte Worte
Beachten Sie, dass sich bestimmte Programme je nach verwendeter Unix-Version möglicherweise etwas anders verhalten (z. B.
ps
die PID in Spalte $ 3 ausgeben). Wenn etwas falsch oder anders scheint, lesen Sie die Dokumentation Ihres Anbieters (oder besser dieman
Seiten). Seien Sie auch vorsichtig, da lange Rohre gefährlich sein können. Machen Sie keine besonderen Annahmen, wenn Sie Befehle wiekill
oder verwendenrm
. Wenn es beispielsweise einen anderen Benutzer mit dem Namen "conky" (oder "Aconkyous") gab, kann mein Befehl auch alle laufenden Prozesse beenden!Was ich sage, ist Vorsicht, besonders bei langen Rohren. Es ist immer besser, es interaktiv aufzubauen, als Annahmen zu treffen und sich später zu entschuldigen.
quelle
kill $(pgrep conky)
pkill conky
grep
Anruf ausführen können.grep [c]onky
ist was Sie suchen.Mein Favorit ist dieser:
youtube-dl $1 -q -o - | ffmpeg -i - $2
Lädt ein Video von der angegebenen YouTube-URL herunter
$1
und gibt es als die von angegebene Datei aus$2
. Beachten Sie, wie leise die Datei ist-q
im Hintergrund an STDOUT ausgegeben-o -
, an ffmpeg weitergeleitet und von dort als Eingabe verwendet wird-i -
.Insbesondere für Linux-Neulinge kann dies ein praktisches Beispiel sein, warum die Befehlszeile nützlich sein kann und die Dinge einfacher macht als die Verwendung von GUI-Tools. Ich bin mir nicht sicher, wie lange es dauern würde, ein Video von YouTube herunterzuladen und seinen Sound in eine MP3-Datei umzuwandeln. Die obige Zeile kann das in einigen Sekunden erledigen.
quelle
youtube-dl --extract-audio --audio-format mp3 -a -
. Ein cooles Beispiel, aber es gibt einfachere Möglichkeiten. (Es ruft intern ffmpeg auf.)youtube-dl $1 -q -o - | mplayer -
Spielt das Video direkt im mplayer ab. Ich benutze diesen Befehl von meinem Laptop, um meinem Server (der an das Fernsehgerät angeschlossen ist) mitzuteilen, dass Videos abgespielt werden sollen. Ich muss anhängen-display :0.0 -geometry 400x300+1200+200
, damit das mplayer-Fenster auf dem richtigen Bildschirm angezeigt wird.Die allgemeine Verwendung (sprich: die Art, wie ich es meistens benutze) ist, wenn ich aus irgendeinem Grund einige Daten über mehrere Tools ausführen muss, um verschiedene Verarbeitungsaufgaben auszuführen.
Ich würde also sagen, dass die Verwendung von Pipes als Klebstoff dient, um mehrere Bausteine (die verschiedenen UNIX-Tools) zusammenzufügen. Wie Ulrich sagte,
sort
unduniq
ist eine gemeinsame Strophe.Wenn Sie die Verwendung von Pipes hervorheben möchten, können Sie je nach Publikum beispielsweise mit folgendem beginnen: "Hey, dieser Lehrplan enthält Links zu mehreren interessanten PDFs mit Beiträgen und Vorlesungsskripten, einige davon werden jedoch wiederholt. Kann ich irgendwie automatisieren? "
Dann könnten Sie zeigen , wie
lynx --dump --listonly
die Liste der Links bekommen, wiegrep
für Links filtern könnte enden.pdf
, wiecolrm
odersed
loszuwerden, die Zahlen bekommen konntelynx
schreibt zu jeder URL links, wiesort
unduniq
könnten Duplikate entfernen, und schließlich , wiewget -i -
verwendet werden kann , die zum Abrufen Dateien (mit--wait
um den Server zu schonen).Ich fürchte, das ist ein komplexes Beispiel. Auf der anderen Seite kann es hilfreich sein, die Leistung von Pfeifen zu zeigen, wenn Sie sie nur pfeifen und die Shell alles auf einmal laufen lassen.
quelle
sort -u
in GNU-Coreutils verwenden .Ich weiß nicht genau, was gut ist, aber das Durchpfeifen
grep
muss eine der häufigsten Anwendungen sein, möglicherweise gefolgt vonwc -l
. (Ja,grep
hat den wenig bekannten-c
Schalter.)Eine weitere häufige Zeilengruppe ist
| sort | uniq
, wenn auch nur, weiluniq
die Eingabe sortiert werden muss.quelle
... | sort -u
wenn verfügbar!Nicht, dass Sie es für dieses Beispiel benötigen, aber:
... das Umkehren der Greps-Reihenfolge bewahrt die Färbung, ist aber VIEL weniger effizient. vermutlich auf großen Listen, würde Farbe nicht ausmachen.
Auch diese Webseite schlägt vor:
https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep
... aber das wird nicht funktionieren, wenn Sie einen einzelnen Buchstaben suchen (wie Prozess 'X').
quelle
Endlich kann ich dieses Durcheinander mit einem Oneliner teilen, den ich vor ungefähr eineinhalb Jahren gemacht habe ...
Es...
Ich wette, das hätte mit einem einzigen Python-Skript viel besser gemacht werden können.
quelle
Das ist mir als erstes in den Sinn gekommen ...
mysqldump
ist eine Konsolenanwendung, die Daten, Schemata und optional Prozeduren und Funktionen an stdout sendet. Normalerweise wird es zur Sicherung in eine Datei umgeleitet.mysqldump <options> > mydb.dump
Das würde Ihnen ein unkomprimiertes SQL-Skript geben. Um Platz zu sparen, können Sie es mit bzip2 komprimieren.
bzip2 mydb.dump
Alternativ können Sie beide Schritte in einem Schritt ausführen:
mysqldump <options> | bzip2 > mydb.dump.bz2
In diesem obigen Beispiel wird die stdout von
mysqldump
an bzip2 weitergeleitet, dessen Ausgabe dann in eine Datei umgeleitet wird.quelle
bzcat mydb.dump.bz2 | mysql <options>
.Hier ist ein Beispiel, das ich in meinem Job für mehrere Pipes in einem Befehl verwende. Dies verwendet gawk, um das allgemeine MySQL-Abfrageprotokoll ($ OFILE) zu durchsuchen und alle abgelehnten Anmeldungen zu finden. Anschließend wird diese Liste nach Namen sortiert, die Liste wird an uniq weitergeleitet, wobei die Vorkommen gezählt werden. Anschließend wird die Liste ein letztes Mal weitergeleitet, um die gezählte Liste numerisch zu sortieren.
quelle
Pipes eignen sich am besten für Filter und Übersetzer
Auf diese Weise können die Daten von einem Programm zum nächsten gepuffert fließen, und zu keinem Zeitpunkt müssen sich alle Daten auf einmal im Speicher befinden.
quelle
cat filename | less
ist eine schreckliche Verwendung von Rohrleitungen, da Sie nur tun könnenless filename
Hier ist ein Beispiel für Pips, die ich jeden Tag verwende (aber möglicherweise auch ein schlechtes Beispiel):
ls -la | more -c
Die Antworten von Scott Hoffman und NJSG sind bessere Beispiele.
quelle
Wie wäre es mit: Mustersuche und Anzeige des zuletzt auftretenden Musters?
Zeigt an, wie zu verwenden
tail
,sed
undgrep
in einem Rohr Kontext, der Schritt für Schritt aufgebaut werden kann.quelle
Führen Sie diesen Befehl in einem beliebigen Verzeichnis aus, für das Sie eine sortierte Analyse der Ordnergröße durchführen möchten (dann scrollen Sie mit der END-Taste nach unten):
Sortiert nach Ordnergrösse
quelle
Hier ist ein Beispiel, das ich zum Setzen der DISPLAY-Variablen verwendet habe, als xauth keine Option war ...
Der erste Befehl ruft die benötigten Daten ab, dh Hostname oder IP. Der zweite Befehl erhält genau diese Daten (letztes Feld). Schließlich entfernt der letzte Befehl Klammern aus den Daten.
quelle
Befehls-Piping können Sie überall dort verwenden, wo Sie das Gefühl haben, dass die Ausgabe des ersten Befehls als Eingabe an die nächste weitergeleitet werden kann.
Beispiele.
Katzenbeispiel txt | grep {some_line} | awk {some_command}
Es ist einfach das Konzept, dass, wenn Sie glauben, dass die Ausgabe eines Befehls, den Sie ausgeführt haben, die Eingabe eines anderen Befehls sein kann, den Sie weiterleiten können.
quelle