2016-04-06 57 views
0

我有一個腳本,它搜索多個不同文件夾中的短語文件,然後顯示輸出。unix腳本並行運行搜索

麻煩的是,它按順序進行每次搜索並花費很長時間。我想讓搜索無需等待前一個結束就運行。

zipped_folders=("/extlogs/archive/rsyslog/folder1/" 
       "/extlogs/archive/rsyslog/folder2/") 

folders=("/extlogs/rsyslog/Folder1/" 
     "/extlogs/rsyslog/Folder2/") 

portal=0 
mobile=0 
email=0 

if [ "$#" -ne 1 ]; then 
    echo "Incorrect Argument: logcount 201602" 
    exit 1 
fi 

for i in "${zipped_folders[@]}" 
do 
    #echo $i"syslog-"$1*".log.gz" 
    ((portal+=$(nohup gunzip -c $i"syslog-"$1*".log.gz" | grep -i "search1" | grep -v "Search1" | wc -l &))) 
    ((mobile+=$(nohup gunzip -c $i"syslog-"$1*".log.gz" | grep -i "Search2" | wc -l &))) 
    ((email+=$(nohup gunzip -c $i"syslog-"$1*".log.gz" | grep -i "search3" | grep -v "ActiveSync" | wc -l &))) 
done 

for i in "${folders[@]}" 
do 
    ((portal+=$(nohup cat $i"syslog-"$1*".log"| grep -i "search4"| grep -v "exsearch4" | wc -l &))) 
    ((mobile+=$(nohup cat $i"syslog-"$1*".log" | grep -i "search5" | wc -l &))) 
    ((email+=$(nohup cat $i"syslog-"$1*".log" | grep -i "search6" | grep -v "ActiveSync" | wc -l &))) 
done 

echo "Portal: " $portal 
echo "Mobile: " $mobile 
echo "Email: " $email 

exit 1 

回答

1

您可以使用xargs

find ${topdir} -name '*.gz' | xargs -n1 -P${PARALLEL_JOBS} -I {} bash -c "/usr/bin/grep 'criteria' {}" 
+0

好,但是啓動無限數量的並行進程有多危險? –

+0

每次調用xargs時,子進程的數量(AKA「扇出」)是有限的。所有你需要做的就是限制'xargs'調用的數量,例如通過將在子shell中爲搜索提供輸入的代碼分組,並將它作爲'(find ...;)提供給一個'xargs'。找到......; echo「onemore.tgz」)| xargs ...' – bobah