2011-06-05 77 views
1

我正在編寫一些BASH shell腳本,它將不斷檢查文件以查看文件是否已經包含「Completed!」在繼續之前。 (當然,假設文件正在更新並最終將包含「已完成!」)短語如何進行一次包含shell中文件的文件

我不知道如何做到這一點。感謝您的幫助。

回答

4

你可以這樣做:

while ! grep -q -e 'Completed!' file ; do 
    sleep 1 # Or some other number of seconds 
done 

# Here the file contains completed 
+0

如果您希望Completed上的匹配區分大小寫,您可以在grep後添加-i。 – Zugwalt 2011-06-05 20:34:58

1

當中的標準工具,tail有一個選項,以保持從文件中讀取:tail -f。因此請過濾tail -f的輸出。

<some_file tail -f -n +1 | grep 'Completed!' | head -n 1 >/dev/null 

由於緩衝可能會有延遲。您至少可以通過在流水線中使用較少的工具來減少延遲。實際上,當您執行tail -f時,tail的某些實現從不緩衝,因此,只要將Completed!寫入文件,下面的代碼片段就會返回。

<some_file tail -f -n +1 | sed -e '/Completed!/ q' 

這假定文件正在被其他工具追加。如果文件在啓動tail後被數據生成程序覆蓋,則此解決方案將不起作用。你可以search the file periodically。在某些系統上,你可以調用通知機制來知道文件何時改變,例如在Linux下使用inotifywait。圍繞* *完成字符串

tail -f somefile | while read line 
do 
    echo $line 
    [[ $line == *Completed!* ]] && break 
done 

注意沒有引號!

0

我在Kornshell做到了這一點。這允許雙方括號進行全局模式匹配而不是字符串匹配。

這似乎也適用於BASH。但是,Completed必須以NL結尾。否則,它會在打破循環之前需要額外的一行。

您可以使用grep太:

tail -f somefile | while read line 
do 
    echo $line 
    grep -iq "Completed!" && break 
done 

-q參數意味着寧靜。如果您的grep未採用-q參數,則可能必須將其管道連接到/dev/null-i是無視情況。你是否想要這樣做取決於你。

好處是你沒有做任何處理,除非有一行要閱讀。使用sleep可能意味着您錯過了該行,或者在沒有行添加到文件時正在處理該行。

0

在管道中使用grep,您可以通過添加--line-buffered選項打開線路緩衝模式!

相關問題