2016-03-14 57 views
3

我遇到了sed問題,我無法弄清楚,而且我也是業餘愛好者。不能得到這個簡單的sed命令

我的代碼的目標是保持監視文件(OutputFile.dat),直到找到可能的字符串(NaN或STOP),然後殺死在後臺運行的程序。它工作時,我只嘗試過一個字符串。但是當我試圖實現更多可能的匹配時,代碼無法工作。

../program inputfile &> OutputFile.dat & 
    tail -f OutputFile.dat | sed -n '/NaN/q;/STOP/q' 
    killall program 

我試過很多不同的東西,但我無法弄清楚這一點。替代性的建議來實現同樣的事情也是受歡迎的。

在此先感謝

+0

'的egrep「的NaN | STOP」'會發現弦,不知道第二步,或許尋找非零返回代碼,然後殺了??? –

回答

4

這是棘手的,由於緩衝和競爭條件。目前存在的問題與您的代碼是:

  1. OutputFile.dat是在後臺異步創建,並不在那裏當tail試圖尋找它。

    您可以通過打開文件同步

  2. program可以緩衝輸出到出於效率的考慮更大的塊解決這個問題,因爲它不覺得你在乎時間。

    您可以嘗試通過要求program不緩衝或在GNU/Linux上使用stdbuf來解決此問題。

  3. sed識別出匹配後,尾部將需要檢測並寫入另一個緩衝區已滿的數據,然後才意識到退出並讓腳本繼續。

    您可以通過構建腳本來等待sed而不是tail來解決此問題。

既然你說你的腳本適用於一個關鍵詞,你的攪局者可能#3,如果你的第二個關鍵字出現接近年底或輸出暫停。

總之,這將是:

#!/bin/bash 
(stdbuf -o 0 -e 0 ../program inputfile &) &> OutputFile.dat 
sed -n '/NaN/q;/STOP/q' <(tail -f OutputFile.dat) 
killall program 
+0

那個傢伙,謝謝你的回答,那實際上解決了這個問題。不過,我想我可能會遇到緩衝問題。我正在將一個matlab代碼(優化過程)鏈接到一個linux程序,我需要繼續閱讀輸出以檢查可能的錯誤。當我只在提示符下運行你的消化時,它可以工作,但是,當我通過matlab運行幾次時,我卡在終端上。發生這種情況時,我檢查其中一個輸出文件,並且程序已經完成。看來sh不能完成。你有什麼想法,或者任何解決方案嗎? –

+0

如果多次並行運行,所有實例都將爭用名稱「OutputFile.dat」。確保每個實例寫入不同的文件名。 –

+0

我沒有並行運行,以避免寫入相同文件的問題。我無法更改程序的輸出(程序寫入的那個),因此我無法並行運行。 –