2016-04-06 8 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'の呼び出しごとに制限されます。たとえば、検索のための入力をサブシェルにグループ化し、それを単一の 'xargs'に'(find ...;)することで、 'xargs'呼び出しの数を制限するだけです。 find ...; echo "onemore.tgz")| xargs ... ' – bobah

関連する問題