2012-01-26 18 views
0

具有大組文件,我需要到grep通過,我是一個bash腳本中做這樣的:擊「PS」並行處理,並檢查時,他們正在做

#! /usr/bin/env bash 

REX="word" 
grep -IP $REX A* >> result & 
grep -IP $REX B* >> result & 
grep -IP $REX C* >> result & 
grep -IP $REX D* >> result & 
[..] 

如何知道當所有的過程完成後?

+1

爲什麼不使用'find'和'xargs'來查找所需的所有文件並並行處理它們? –

+1

或者GNU或者BSD'parallel' – mkb

回答

4

我會去解決你的問題的不同方式。 find可以在您的文件系統上找到特定的文件,並且xargs允許您在給定的輸入文件上運行命令。所以我會用這樣的命令:

find ./ -type f -print0 | xargs -0 -I{} -n1 -P4 grep -IP $REX '{}' >> result 

這將搜索,在所有的普通文件(-type f)當前目錄(./)開始,並通過他們對xargs安全的情況下,有任何空間文件名(-print0)。 xargs然後,對於每個命令,運行您的grep命令。 -I{}告訴xargs它看到的地方{}它會將文件名插入到命令中。這裏不是絕對必要的,但是很好的做法。 -0-print0find齊頭並進,並告訴它以期望的方式輸入。 -P4告訴xargs同時運行多達4個進程,-n1(如手冊頁所述)暗示xargs每個命令一次只能使用一個參數。

您可以在這裏進行各種調整,無論它是不是想要搜索所有文件,或只需要進入certian深度,但是這個常規命令應該讓您開始處理這類任務。

+0

grep的並行執行可能會導致結果文件中的混合輸出,因此是不理想的想法。一旦-P4完成,你可以簡單地使用'find。 -type f -exec grep -IPh $ REX「{}」「+」>> result'不需要xargsing。 (我認爲用'-n1'使用xargs會導致沒有文件名被grep打印在前面,因此可以通過'-h' grep選項進行補償。) –

1

嘗試檢查jobs -p | wc -l的輸出是否爲零行。

僅供參考:與使用shell作爲工作管理器相比,有更好的方法來執行並行處理。 find -print0xargs -0 -P是我個人的最愛。

+0

你能詳細說明一下使用find + xargs進行grepping嗎?謝謝 – pistacchio

+0

@pistacchio'find。 -maxdepth 1 -name「[ABCD] *」-print0 | xargs -0 grep -IP $ REX >>結果' – Borealid

0

使用等待。在這種情況下,我甚至不認爲你需要保存並指定pid,例如

#! /usr/bin/env bash 

REX="word" 
grep -IP $REX A* >> result & 
grep -IP $REX B* >> result & 
grep -IP $REX C* >> result & 
grep -IP $REX D* >> result & 
[..] 
wait 
echo "done" 

注意,有更好的方式方法可以做到這比一切都上市了。例如,您可以將ls導入xargs,或者使用exec來查找。

4

使用BASH內置的 '等待'

等待[N ...]

等待每個指定的進程,返回它的終止狀態。每個n可以是進程ID或工作規範;如果給出了工作規範,則等待該作業管道中的所有進程。如果沒有給出n,則等待所有當前活動的子進程,並且返回狀態爲零。如果n指定不存在的進程或作業,則返回狀態爲127.否則,返回狀態爲最後進程或作業等待的退出狀態。

你的情況應該是不夠的,只是:

REX="word" 
grep -IP $REX A* >> result & 
grep -IP $REX B* >> result & 
grep -IP $REX C* >> result & 
grep -IP $REX D* >> result & 

echo "Waiting..." 
wait 
echo "All child terminated"