Я использую xargs
с опцией --max-args=0
(альтернативно -P 0
).
Однако выходные данные процессов объединяются в stdout
поток без учета правильного разделения строк. Поэтому я часто получаю такие строки:
<start-of-line-1><line-2><end-of-line-1>
Как я использую egrep
с ^
в моем шаблоне на всей xargs
продукции этого Мессинг мой результат.
Есть ли какой-нибудь способ заставить xargs
записывать выходные данные процесса по порядку (в любом порядке, если выходные данные одного процесса непрерывны)?
Или какое-то другое решение?
Изменить: более подробную информацию о сценарии использования:
Я хочу загружать и анализировать веб-страницы с разных хостов. Поскольку загрузка каждой страницы занимает около секунды, а есть несколько десятков страниц, я хочу распараллелить запросы.
Моя команда имеет следующую форму:
echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
wget -q -O- http://{}/somepage.html | egrep --count '^string'
Я использую bash, а не что-то вроде Perl, потому что IP-адреса хоста (переменная $ IPs) и некоторые другие данные поступают из включенного файла bash.
источник
xargs
.xargs
кажется, не предоставляет такую функцию.make
функцию заданий, я думаю, чтоmake
объединяет выходные строки правильно.--line-buffered
флага, чтобыegrep
помочьОтветы:
Это должно сделать трюк:
Идея здесь состоит в том, чтобы сделать отдельные подсчеты и суммировать их в конце. Может потерпеть неудачу, если отдельные подсчеты достаточно велики, чтобы их можно было смешать, но это не должно иметь место.
источник
GNU Parallel специально разработан для решения этой проблемы:
Если ваши IP-адреса находятся в файле, это еще красивее:
Чтобы узнать больше, посмотрите вступительное видео: http://www.youtube.com/watch?v=OpaiGYxkSuQ
источник
parallel
команду moreutils , которой здесь достаточно:parallel -j99 -i sh -c 'wget -q -O- http://{}/somepage.html | egrep -c "^string"' -- $IPs