Używam xargs
z opcją --max-args=0
(alternatywnie -P 0
).
Jednak wyniki procesów są scalane ze stdout
strumieniem bez uwzględnienia właściwego rozdzielenia linii. Więc często kończę liniami takimi jak:
<start-of-line-1><line-2><end-of-line-1>
Ponieważ używam egrep
z ^
moim wzorem na całej xargs
wyjście to jest brudząc się mój wynik.
Czy jest jakiś sposób na wymuszenie xargs
zapisu wyników procesu w dowolnej kolejności (w dowolnej kolejności, o ile wynik jednego procesu jest ciągły)?
Lub jakieś inne rozwiązanie?
Edycja: więcej szczegółów na temat przypadku użycia:
Chcę pobierać i analizować strony internetowe z różnych hostów. Ponieważ ładowanie każdej strony zajmuje około sekundy, a istnieje kilkadziesiąt stron, chcę zrównoważyć żądania.
Moje polecenie ma następującą postać:
echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
wget -q -O- http://{}/somepage.html | egrep --count '^string'
Używam bash, a nie czegoś takiego jak Perl, ponieważ adresy IP hosta (zmienna $ IPs) i niektóre inne dane pochodzą z dołączonego pliku bash.
źródło
xargs
.xargs
nie wydaje się zapewniać takiej funkcji.make
z funkcji zadań, myślę, że odpowiedniomake
łączy linie wyjściowe.--line-buffered
flagę, abyegrep
pomócOdpowiedzi:
To powinno załatwić sprawę:
Chodzi o to, aby osobno policzyć i zsumować je na końcu. Może się nie powieść, jeśli osobne liczby są wystarczająco duże, aby je pomieszać, ale nie powinno tak być.
źródło
GNU Parallel jest specjalnie zaprojektowany, aby rozwiązać ten problem:
Jeśli twoje adresy IP znajdują się w pliku, jest jeszcze ładniejsze:
Aby dowiedzieć się więcej, obejrzyj wideo wprowadzające: http://www.youtube.com/watch?v=OpaiGYxkSuQ
źródło
parallel
polecenie z moreutils , które jest wystarczające tutaj:parallel -j99 -i sh -c 'wget -q -O- http://{}/somepage.html | egrep -c "^string"' -- $IPs