xargs
옵션과 함께 사용 하고 있습니다 --max-args=0
(또는 -P 0
).
그러나 공정의 출력은 stdout
적절한 라인 분리를 고려하지 않고 스트림으로 병합됩니다 . 그래서 종종 다음과 같은 줄로 끝납니다.
<start-of-line-1><line-2><end-of-line-1>
전체 출력 에서 패턴을 사용 egrep
하면서 결과가 엉망이됩니다.^
xargs
강제하는 몇몇 방법이있다 xargs
(어느 한 프로세스의 출력은 연속 한, 임의의 순서로)의 처리 순서를 출력 쓰기는?
아니면 다른 해결책?
편집 : 사용 사례에 대한 자세한 내용 :
다른 호스트에서 웹 페이지를 다운로드하고 구문 분석하고 싶습니다. 모든 페이지를로드하는 데 약 1 초가 걸리고 수십 페이지가 있으므로 요청을 병렬화하려고합니다.
내 명령은 다음과 같은 형식입니다.
echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
wget -q -O- http://{}/somepage.html | egrep --count '^string'
호스트 IP ($ IPs 변수)와 다른 데이터는 포함 된 bash 파일에서 가져 오기 때문에 Perl과는 다른 bash를 사용합니다.
답변
트릭을 수행해야합니다.
echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
sh -c "wget -q -O- 'http://{}/somepage.html' | egrep --count '^string'" | \
{ NUM=0; while read i; do NUM=$(($NUM + $i)); done; echo $NUM; }
여기서 아이디어는 별도의 수를 세어 마지막에 합산하는 것입니다. 개별 카운트가 혼합 될만큼 충분히 크면 실패 할 수 있지만, 그렇지 않아야합니다.
답변
GNU Parallel은이 문제를 해결하기 위해 특별히 고안되었습니다.
echo -n $IPs | parallel -d ' ' -j0 wget -q -O- http://{}/somepage.html | egrep --count '^string'
IP가 파일에 있으면 훨씬 더 예쁘다.
cat IPs | parallel -j0 wget -q -O- http://{}/somepage.html | egrep --count '^string'
자세한 내용은 소개 동영상을 참조하십시오 . http://www.youtube.com/watch?v=OpaiGYxkSuQ