具有大組文件,我需要到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 &
[..]
如何知道當所有的過程完成後?
具有大組文件,我需要到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 &
[..]
如何知道當所有的過程完成後?
我會去解決你的問題的不同方式。 find
可以在您的文件系統上找到特定的文件,並且xargs
允許您在給定的輸入文件上運行命令。所以我會用這樣的命令:
find ./ -type f -print0 | xargs -0 -I{} -n1 -P4 grep -IP $REX '{}' >> result
這將搜索,在所有的普通文件(-type f
)當前目錄(./
)開始,並通過他們對xargs
安全的情況下,有任何空間文件名(-print0
)。 xargs
然後,對於每個命令,運行您的grep
命令。 -I{}
告訴xargs
它看到的地方{}
它會將文件名插入到命令中。這裏不是絕對必要的,但是很好的做法。 -0
與-print0
從find
齊頭並進,並告訴它以期望的方式輸入。 -P4
告訴xargs
同時運行多達4個進程,-n1
(如手冊頁所述)暗示xargs
每個命令一次只能使用一個參數。
您可以在這裏進行各種調整,無論它是不是想要搜索所有文件,或只需要進入certian深度,但是這個常規命令應該讓您開始處理這類任務。
grep的並行執行可能會導致結果文件中的混合輸出,因此是不理想的想法。一旦-P4完成,你可以簡單地使用'find。 -type f -exec grep -IPh $ REX「{}」「+」>> result'不需要xargsing。 (我認爲用'-n1'使用xargs會導致沒有文件名被grep打印在前面,因此可以通過'-h' grep選項進行補償。) –
嘗試檢查jobs -p | wc -l
的輸出是否爲零行。
僅供參考:與使用shell作爲工作管理器相比,有更好的方法來執行並行處理。 find -print0
到xargs -0 -P
是我個人的最愛。
你能詳細說明一下使用find + xargs進行grepping嗎?謝謝 – pistacchio
@pistacchio'find。 -maxdepth 1 -name「[ABCD] *」-print0 | xargs -0 grep -IP $ REX >>結果' – Borealid
使用等待。在這種情況下,我甚至不認爲你需要保存並指定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來查找。
使用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"
爲什麼不使用'find'和'xargs'來查找所需的所有文件並並行處理它們? –
或者GNU或者BSD'parallel' – mkb