Spezifische Verwendung von GNU Parallel

Spezifische Verwendung von GNU Parallel

Was ist das?

GNU Parallel ist ein Shell-Tool zum parallelen Ausführen von Rechenaufgaben auf einem oder mehreren Computern. Eine Rechenaufgabe kann ein Shell-Befehl oder ein Skriptprogramm sein, bei dem jede Zeile als Eingabe dient. Typische Eingaben sind Listen von Dateien, Hosts, Benutzern, URLs oder Tabellen; eine Berechnungsaufgabe kann auch ein aus einer Pipe gelesener Befehl sein. GNU Parallel teilt die Eingabe in Blöcke auf und führt sie parallel über Pipelines aus.

Wenn Sie wissen, wie die Befehle xargs und tee verwendet werden, werden Sie GNU Parallel sehr benutzerfreundlich finden, da GNU Parallel über dieselben Optionen wie xargs verfügt. GNU Parallel kann die meisten Shell-Schleifen ersetzen und Rechenaufgaben schneller parallel erledigen.

GNU Parallel stellt sicher, dass die Ausgabe dieselbe ist wie bei der sequentiellen Ausführung der Rechenaufgabe, sodass die Ausgabe von GNU Parallel bequem als Eingabe anderer Programme verwendet werden kann.

GNU Parallel führt für jede Eingabezeile den angegebenen Befehl aus und verwendet dabei diese Zeile als Argument. Wenn kein Befehl angegeben wird, wird die Zeile als Befehl ausgeführt. Mehrere Eingabezeilen werden parallel ausgeführt. GNU Parallel wird häufig als Ersatz für xargs oder cat | bash verwendet.

Führung

Dieses Tutorial demonstriert die meisten Funktionen von GNU Parallel. Dies soll eher eine Option in GNU Parallel einführen als Beispiele für die Verwendung in der Praxis liefern. Verbringen Sie eine Stunde mit diesem Tutorial und Sie werden sich in die Befehlszeile verlieben.

Vorbereitung

Um den Beispielen in diesem Tutorial folgen zu können, müssen Sie zunächst Folgendes tun:

parallel >= version 20130814

Installieren Sie die neueste Version:

(wget -O - pi.dk/3 || curl pi.dk/3/) | bash

Mit diesem Befehl wird auch die neueste Version des Handbuchs installiert.

man parallel_tutorial

Der Großteil dieses Tutorials ist auch mit älteren Versionen kompatibel.

abc-Datei

Makefile:

parallel -k echo ::: ABC > abc-Datei

def-Datei

Makefile:

parallel -k echo :::DEF > def-Datei

abc0-Datei

Makefile:

perl -e 'printf "A\0B\0C\0"' > abc0-Datei

abc_-Datei

Makefile:

perl -e 'printf "A_B_C_"' > abc_-Datei

tsv_datei.tsv

Makefile:

perl -e 'printf "f1\tf2\nA\tB\nC\tD\n"' > tsv-Datei.tsv

Anzahl30000

Makefile:

perl -e 'für(1..30000){print "$_\n"}' > Zahl30000

Anzahl1000000

Makefile:

perl -e 'für(1..1000000){print "$_\n"}' > Zahl1000000

Anzahl_%Header

Makefile:

(echo %head1; echo %head2; perl -e 'für(1..10){print "$_\n"}') > Anzahl_%header

Remote-Ausführung: SSH-Anmeldung ohne Passwort bei $SERVER1 und $SERVER2

Makefile:

SERVER1=server.beispiel.com
SERVER2=server2.beispiel.net

Schließlich sollte der folgende Befehl erfolgreich ausgeführt werden:

ssh $SERVER1 echo funktioniert
ssh $SERVER2 echo funktioniert

Verwenden Sie ssh-keygen -t dsa; ssh-copy-id $SERVER1, um die Umgebung zu erstellen (verwenden Sie eine leere Passphrase).

Eingangsquelle

Die Eingabequellen von GNU Parallel unterstützen Dateien, Befehlszeilen und die Standardeingabe (stdin oder Pipe).

Einzelne Eingangsquelle

Eingabe aus der Kommandozeile lesen:

paralleles Echo ::: ABC

Ausgabe (Reihenfolge kann variieren, da Aufgaben parallel ausgeführt werden):

A
B
C

Datei als Eingabequelle:

parallel -a abc-file echo

Die Ausgabe ist die gleiche wie oben.

STDIN (Standardeingabe) als Eingabequelle:

cat abc-Datei | paralleles Echo

Die Ausgabe ist die gleiche wie oben.

Mehrere Eingangsquellen

GNU Parallel unterstützt die Angabe mehrerer Eingabequellen in der Befehlszeile und generiert alle möglichen Kombinationen:

paralleles Echo ::: ABC ::: DEF

Ausgabe:

ANZEIGE
AE
AF
BD
SEI
BF
CD
CE
CF

Mehrere Dateien als Eingabequellen:

parallel -a abc-Datei -a def-Datei echo

Die Ausgabe ist die gleiche wie oben.

STDIN (Standardeingabe) kann mit "-" als eine der Eingabequellen verwendet werden:

cat abc-Datei | parallel -a - -a def-Datei echo

Die Ausgabe ist die gleiche wie oben.

Sie können "::::" anstelle von -a verwenden:

cat abc-Datei | parallel echo :::: - def-Datei

Die Ausgabe ist die gleiche wie oben.

::: und :::: können gemischt werden:

paralleles Echo ::: ABC :::: def-Datei

Die Ausgabe ist die gleiche wie oben.

Anpassungsparameter

–xapply nimmt ein Argument von jeder Eingabequelle:

parallel --xapply echo :::ABC :::DEF

Ausgabe:

ANZEIGE
SEI
CF

Wenn eine der Eingabequellen kürzer ist, wird ihr Wert wiederholt:

parallel --xapply echo ::: ABCDE ::: FG

Ausgabe:

AF
BG
CF
DG
EF

Ändern des Parametertrennzeichens

GNU Parallel ermöglicht es Ihnen, Trennzeichen anstelle von ::: oder :::: anzugeben, was insbesondere dann nützlich ist, wenn diese beiden Symbole durch andere Befehle belegt sind:

parallel --arg-sep ,, echo ,, ABC :::: def-Datei

Ausgabe:

ANZEIGE
AE
AF
BD
SEI
BF
CD
CE
CF

So ändern Sie das Parametertrennzeichen:

parallel --arg-file-sep // echo ::: ABC // def-Datei

Die Ausgabe ist die gleiche wie oben.

Ändern von Parametertrennzeichen

Standardmäßig behandelt GNU Parallel eine Zeile als einen Parameter: Es verwendet \n als Parametertrennzeichen. Mit -d können Sie Folgendes ändern:

parallel -d _ echo :::: abc_-datei

Ausgabe:

A
B
C

\0 steht für NULL:

parallel -d '\0' echo :::: abc0-Datei

Die Ausgabe ist die gleiche wie oben.

-0 ist die Abkürzung für -d '\0' (wird häufig verwendet, um Eingaben von find ... -print0 zu lesen):

parallel -0 echo ::::abc0-Datei

Die Ausgabe ist die gleiche wie oben.

Endwert in Eingabequelle

GNU Parallel unterstützt die Angabe eines Wertes als Endzeichen:

parallel -E Stopp Echo ::: AB Stopp CD

Ausgabe:

A
B

Leere Zeilen überspringen

Verwenden Sie --no-run-if-empty, um leere Zeilen zu überspringen:

(Echo 1; Echo; Echo 2) | parallel --no-run-if-empty echo

Ausgabe:

1
2

Befehlszeile erstellen

Es ist kein Befehl angegeben, was bedeutet, dass das Argument der Befehl ist.

Wenn nach parallel kein Befehl angegeben wird, werden diese Argumente als Befehle behandelt:

parallel ::: ls 'echo foo' pwd

Ausgabe:

[Aktuelle Dateiliste]
foo
[Pfad zum aktuellen Arbeitsverzeichnis]

Der Befehl kann eine Skriptdatei, eine ausführbare Binärdatei oder eine Bash-Funktion sein (die Funktion muss mit „export -f“ exportiert werden):

# Funktioniert nur in Bash und nur wenn $SHELL=.../bash
meine_funktion() {
 echo in my_func $1
}
export -f meine_funktion
parallel meine_funktion ::: 1 2 3

Ausgabe:

in my_func 1
in my_func 2
in my_func 3

Zeichenfolge ersetzen

5 Arten von Ersatzsaiten

GNU Parallel unterstützt eine Vielzahl von Ersetzungszeichenfolgen. Standardmäßig wird {} verwendet:

paralleles Echo ::: A/BC

Ausgabe:

ABC

Geben Sie {} an:

paralleles Echo {} ::: A/BC

Die Ausgabe ist die gleiche wie oben

Entfernen Sie die Erweiterung {.}:

paralleles Echo {.} ::: A/BC

Ausgabe

A/B

Entfernen Sie den Pfad {/}:

paralleles Echo {/} ::: A/BC

Ausgabe:

vor Christus

Behalten Sie nur den Pfad {//}:

paralleles Echo {//} ::: A/BC

Ausgabe:

A

Entfernen Sie den Pfad und die Erweiterung {/.}:

paralleles Echo {/.} ::: A/BC

Ausgabe:

B

Ausgabeaufgabennummer:

paralleles Echo {#} ::: A/BC

Ausgabe:

1
2
3

Ändern der Ersetzungszeichenfolge

Verwenden Sie -I, um die Ersetzungszeichenfolge in {} zu ändern:

parallel -I ,, echo ,, ::: A/BC

Ausgabe:

ABC

--extensionreplace ersetzen {.}:

parallel --extensionreplace ,, echo ,, ::: A/BC

Ausgabe:

A/B

–basenamereplace ersetzt {/}:

parallel --basenamereplace ,, echo ,, ::: A/BC

Ausgabe:

vor Christus

--dirnamereplace ersetzen {//}:

parallel --dirnamereplace ,, echo ,, ::: A/BC

Ausgabe:

A

–basenameextensionreplace ersetzt {/.}:

parallel --basenameextensionreplace ,, echo ,, ::: A/BC

Ausgabe:

B

–seqreplace ersetzt {#}:

parallel --seqreplace ,, echo ,, ::: ABC

Ausgabe:

1
2
3

Ersetzen Sie die Zeichenfolge an der angegebenen Position

Wenn mehrere Eingabequellen vorhanden sind, können Sie die Parameter einer bestimmten Eingabequelle über {number} angeben:

paralleles Echo {1} und {2} ::: AB ::: CD

Ausgabe:

A und C
A und D
B und C
B und D

Sie können / // /. und .: verwenden, um die angegebene Ersetzungszeichenfolge zu ändern:

paralleles Echo /={1/} //={1//} /.={1/.} .={1.} ::: A/BC D/EF

Ausgabe:

/=BC //=A /.=B .=A/B
/=EF //=D /.=E .=D/E

Positionen können negativ sein, was auf eine Rückwärtszählung hinweist:

paralleles Echo 1={1} 2={2} 3={3} -1={-1} -2={-2} -3={-3} ::: AB ::: CD ::: EF

Ausgabe:

1=A 2=C 3=E -1=E -2=C -3=A
1=A 2=C 3=F -1=F -2=C -3=A
1=A 2=D 3=E -1=E -2=D -3=A
1=A 2=D 3=F -1=F -2=D -3=A
1=B 2=C 3=E -1=E -2=C -3=B
1=B 2=C 3=F -1=F -2=C -3=B
1=B 2=D 3=E -1=E -2=D -3=B
1=B 2=D 3=F -1=F -2=D -3=B

Spaltenweise Eingabe

Verwenden Sie --colsep, um die Zeilen in der Datei als Eingabeparameter in Spalten aufzuteilen. Im Folgenden wird die TAB-Taste (\t) verwendet:

1=f1 2=f2
1=A 2=B
1=C 2=D

Parameternamen angeben

Verwenden Sie --header, um den ersten Wert in jeder Eingabezeile als Parameternamen zu verwenden:

parallel --header : echo f1={f1} f2={f2} ::: f1 AB ::: f2 CD

Ausgabe:

f1 = A f2 = C
f1 = EIN f2 = D
f1=B f2=C
f1=B f2=D

Verwenden Sie --colsep, um Dateien zu verarbeiten, die TAB als Trennzeichen verwenden:

parallel --header : --colsep '\t' echo f1={f1} f2={f2} :::: tsv-datei.tsv

Ausgabe:

f1=A f2=B
f1=C f2=D

Mehrere Parameter

–xargs ermöglicht GNU Parallel, mehrere Argumente pro Zeile zu unterstützen (mit einer Obergrenze):

Katze Nummer30000 | parallel --xargs echo | wc -l

Ausgabe:

2

Die 30.000 Parameter sind auf zwei Zeilen aufgeteilt.

Die Obergrenze für die Anzahl der Parameter in einer Zeile wird mit -s angegeben. Im Folgenden wird angegeben, dass die maximale Länge 10.000 beträgt und in 17 Zeilen aufgeteilt wird:

cat num30000 | parallel --xargs -s 10000 echo | wc -l

Um eine bessere Parallelität zu erreichen, verteilt GNU Parallel die Parameter, nachdem das Lesen der Datei abgeschlossen ist.

GNU Parallel startet die zweite Aufgabe erst, nachdem der letzte Parameter gelesen wurde. Zu diesem Zeitpunkt verteilt es alle Parameter gleichmäßig auf die vier Aufgaben (sofern vier Aufgaben angegeben sind).

Die erste Aufgabe ist dieselbe wie im obigen Beispiel mit –xargs, aber die zweite Aufgabe wird gleichmäßig in 4 Aufgaben aufgeteilt, also insgesamt 5 Aufgaben.

cat num30000 | parallel --jobs 4 -m echo | wc -l

Ausgabe:

5

Zur besseren Übersicht sind dem 10-Punkte-Parameter 4 Aufgaben zugeordnet:

parallel --jobs 4 -m echo ::: {1..10}

Ausgabe:

1 2 3
4 5 6
7 8 9
10

Die Ersetzungszeichenfolge kann Teil eines Wortes sein. Erfahren Sie den Unterschied zwischen -m und -X anhand der folgenden beiden Befehle:

parallel --jobs 4 -m echo pre-{}-post ::: ABCDEFG

Ausgabe:

Vor-A B-Pfosten
vor C D-nach
vor-E F-nach
vor G-Post

-X ist das Gegenteil von -m:

parallel --jobs 4 -X echo pre-{}-post ::: ABCDEFG


Ausgabe:

vor-A-post vor-B-post
vor-C-post vor-D-post
vor-E-post vor-F-post
vor G-Post

Verwenden Sie -N, um die Anzahl der Parameter pro Zeile zu begrenzen:

parallel -N3 echo :::ABCDEFGH

Ausgabe:

ABC
DEF
GH

Mit -N kann auch eine Position angegeben werden, an der eine Zeichenfolge ersetzt werden soll:

parallel -N3 echo 1={1} 2={2} 3={3} ::: ABCDEFGH

Ausgabe:

1=A 2=B 3=C
1=D 2=E 3=F
1=G 2=H 3=

-N0 liest nur ein Argument, hängt aber nichts an:

parallel -N0 echo foo ::: 1 2 3

Ausgabe:

foo
foo
foo

Verweise

Wenn die Befehlszeile Sonderzeichen enthält, müssen diese durch Anführungszeichen geschützt werden.

Das Perl-Skript „print "@ARGV\n"“ macht dasselbe wie das Echo von Linux.

perl -e 'drucken "@ARGV\n"' A

Ausgabe:

A

Wenn Sie diesen Befehl mit GNU Parallel ausführen, muss der Perl-Befehl in Anführungszeichen gesetzt werden:

parallel perl -e 'print "@ARGV\n"' ::: Das wird nicht funktionieren

Ausgabe:

[Nichts]

Verwenden Sie -q, um den Perl-Befehl zu schützen:

parallel -q perl -e 'print "@ARGV\n"' ::: Das funktioniert

Ausgabe:

Das
Werke

Sie können auch ': verwenden.

parallel perl -e \''print "@ARGV\n"'\' ::: Das funktioniert auch

Ausgabe:

Das
Werke,
zu

Verwenden von -quote:

parallel --shellquote
parallel: Achtung: Die Eingabe wird vom Terminal gelesen. Nur Experten machen das absichtlich. Zum Beenden STRG-D drücken.
perl -e 'drucken "@ARGV\n"'
[STRG-D]

Ausgabe:

perl\ -e\ \'drucken\ \"@ARGV\\n\"\'

Sie können auch den folgenden Befehl verwenden:

parallel perl\ -e\ \'print\ \"@ARGV\\n\"\' ::: Das funktioniert auch

Ausgabe:

Das
Auch
Werke

Leerzeichen entfernen

Verwenden Sie --trim, um Leerzeichen zwischen den Argumenten zu entfernen:

parallel --trim r echo pre-{}-post ::: ' A '

Ausgabe:

vor- A-Post

Entfernen Sie die Leerzeichen auf der linken Seite:

parallel --trim l echo pre-{}-post ::: ' A '

Ausgabe:

Vor-A-Post

Entfernen Sie die Leerzeichen auf beiden Seiten:

parallel --trim lr echo pre-{}-post ::: ' A '

Ausgabe:

Vor-A-Post

Steuerausgang

Verwenden Sie den Parameter als Ausgabepräfix:

parallel --tag echo foo-{} ::: ABC

Ausgabe:

Ein foo-A
B foo-B
C foo-C

Ändern Sie das Ausgabepräfix –tagstring:

parallel --tagstring {}-bar echo foo-{} ::: ABC

Ausgabe:

A-Bar Foo-A

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Spezifische Verwendung von GNU Parallel
  • So verwenden Sie eine Multi-Core-CPU, um Ihre Linux-Befehle zu beschleunigen (GNU Parallel)
  • 15-minütiges paralleles Artefakt GNU Parallel Erste Schritte

<<:  Beispielcode für die Django+MySQL-Konfiguration und einfache Bedienung der Datenbank

>>:  Beispielcode für die Verwendung von js zur Implementierung gleichzeitiger Ajax-Anfragen, um die Anzahl der Anfragen zu begrenzen

Artikel empfehlen

Analyse der Gründe, warum das MySQL-Indexsystem den B + -Baum verwendet

Inhaltsverzeichnis 1. Was ist ein Index? 2. Warum...

Detaillierte Erklärung der MySQL Truncate-Verwendung

Inhaltsverzeichnis MySQL Truncate-Verwendung 1. T...

XHTML-Einführungstutorial: Verwendung von Listen-Tags

Listen werden verwendet, um eine Reihe ähnlicher o...

Design-Referenz: Erfolgsbeispiel für die Erstellung einer WordPress-Website

Jede dieser 16 Sites ist eine sorgfältige Lektüre ...

Was Sie über das Erstellen von MySQL-Indizes wissen müssen

Inhaltsverzeichnis Vorwort: 1. Indexmethode erste...

Beispiel für die Implementierung einer eingebetteten Tabelle mit vue+elementUI

Während meines Praktikums im letzten Studienjahr ...

Zwei Möglichkeiten zum Erstellen eines privaten GitLab mit Docker

Die erste Methode: Docker-Installation 1. Ziehen ...

Vue Uniapp realisiert den Segmentierungseffekt

In diesem Artikel wird der spezifische Code von V...

So deinstallieren Sie Node und NPM vollständig auf dem Mac

npm deinstallieren sudo npm deinstallieren npm -g...

MySQL-Datenbank-Grundlagen SQL-Fensterfunktion Beispielanalyse-Tutorial

Inhaltsverzeichnis Einführung Einführung Aggregat...