2016-11-30 158 views
0

我有一個每天24小時日誌的數據。數據是非常大的grep所需的字符串,需要3小時在所有24小時的目錄搜索字符串。 使用&如何在後臺使用bash腳本執行grep鏈命令

cat test.sh 
log1="22 01 02 03 04 05 06 21" 
log2="07 08 09 10 11 12 13 22" 
log3="14 15 16 17 18 19 20 23" 

for me in $log1 
do 
    for me1 in $me 
    do 
      cd $me1 
      $(cat * | grep ASS-va1appus06-1480458532238-14424 | grep -i "am/agent/registered" &) >../log\_$me1 & 
      cd .. 
    done 
done 

這裏的問題減少了耗時,我決定將24小時到三個部分分開,並希望在後臺執行平行每一部分未正常工作expected.its不運行後臺並且不更新日誌文件,進一步處理出來的腳本。

some of the script output is 
+ cd 22 
+ cd .. 
++ grep ASS-va1appus06-1480458532238-14424 
++ grep -i am/agent/registered 
++ cat logfile.log1 logfile.log2 ....... 

,如果你看到的命令不執行按給定的grep序列,

+0

如果你展示了你的輸入數據看起來像什麼樣的輸出,你可能會得到一個很好的答案...... –

+0

點擊你的問題下的「編輯」,並在那裏更新...不在*評論*區。 –

+0

和你的輸入數據? –

回答

1

您錯誤地設計你的paralell通話,並在你的主腳本的呼叫沿碼paralell位混合。你可以試試下面的辦法:

#!/bin/bash 
log1="22 01 02 03 04 05 06 21" 
log2="07 08 09 10 11 12 13 22" 
log3="14 15 16 17 18 19 20 23" 

for me in $log1 
do 
    for me1 in $me 
    do 
      # you could aslo get rid of the cd altogether 
      # (grep "ASS-va1appus06-1480458532238-14424" $me1/* | grep -i "am/agent/registered" >log\_$me1) & 
      (cd $me1 && grep "ASS-va1appus06-1480458532238-14424" * | grep -i "am/agent/registered" >../log\_$me1) & 
    done 
done 
  • (...)意味着我們在子shell執行我們的指令。像變量聲明或cd這樣的變化在這種情況下是有效的,但不影響我們的主要腳本環境。
    • 我們把需要在這個子shell中平行的完整操作。我們需要在這方面提供所有相關信息。
    • 我們將整個子殼對齊。

關於腳本的幾個注意事項:我取下一個useless use of cat,使用paralell計算時也提防在同一文件concurent writtings的。

+0

感謝您獲取清晰的信息和步驟,在上面的代碼中進行了一些更改之後,我甚至可以獲得預期的結果雖然在運行時(set -x)它看起來沒有在序列中執行,但是我得到了我的結果 –

+1

是的,在使用paralelisation時很難施加嚴格的執行順序(你必須使用更高級的東西,比如信號燈和'wait')。但是,對於每個衍生線程,子shell中的所有內容都應該按照該順序執行。 – Aserre