Ich benutze xargs
mit der Option --max-args=0
(alternativ -P 0
).
Die Ausgabe der Prozesse wird jedoch stdout
ohne Rücksicht auf eine ordnungsgemäße Leitungstrennung in den Strom eingebunden . So werde ich oft mit Zeilen enden wie:
<start-of-line-1><line-2><end-of-line-1>
Da ich egrep
mit ^
in meinem Muster auf der gesamten xargs
Ausgabe verwende, ist dies mein Ergebnis durcheinander.
Gibt es eine Möglichkeit, xargs
das Schreiben der Prozessausgaben in der angegebenen Reihenfolge zu erzwingen (eine beliebige Reihenfolge, solange die Ausgabe eines Prozesses zusammenhängend ist)?
Oder eine andere Lösung?
Bearbeiten: Weitere Details zum Anwendungsfall:
Ich möchte Webseiten von verschiedenen Hosts herunterladen und analysieren. Da das Laden jeder Seite etwa eine Sekunde dauert und es ein paar Dutzend Seiten gibt, möchte ich die Anforderungen parallelisieren.
Mein Befehl hat die folgende Form:
echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
wget -q -O- http://{}/somepage.html | egrep --count '^string'
Ich benutze bash und nicht so etwas wie Perl, da die Host-IPs (die $ IPs-Variable) und einige andere Daten aus einer enthaltenen bash-Datei stammen.
quelle
xargs
.xargs
scheint keine solche Funktion zu bieten.make
Job-Funktion verwenden, ich denke,make
die Ausgabezeilen werden ordnungsgemäß zusammengeführt.--line-buffered
Flagge hinzu,egrep
um zu helfenAntworten:
Dies sollte den Trick machen:
Die Idee hier ist, separate Zählungen vorzunehmen und diese am Ende zu summieren. Könnte fehlschlagen, wenn die einzelnen Zählungen groß genug sind, um gemischt zu werden, aber das sollte nicht der Fall sein.
quelle
GNU Parallel wurde speziell entwickelt, um dieses Problem zu lösen:
Wenn Ihre IPs in einer Datei sind, ist es noch schöner:
Weitere Informationen finden Sie im Intro-Video: http://www.youtube.com/watch?v=OpaiGYxkSuQ
quelle
parallel
Befehl von moreutils , der hier ausreicht:parallel -j99 -i sh -c 'wget -q -O- http://{}/somepage.html | egrep -c "^string"' -- $IPs