我正在編寫一些BASH shell腳本,它將不斷檢查文件以查看文件是否已經包含「Completed!」在繼續之前。 (當然,假設文件正在更新並最終將包含「已完成!」)短語如何進行一次包含shell中文件的文件
我不知道如何做到這一點。感謝您的幫助。
我正在編寫一些BASH shell腳本,它將不斷檢查文件以查看文件是否已經包含「Completed!」在繼續之前。 (當然,假設文件正在更新並最終將包含「已完成!」)短語如何進行一次包含shell中文件的文件
我不知道如何做到這一點。感謝您的幫助。
你可以這樣做:
while ! grep -q -e 'Completed!' file ; do
sleep 1 # Or some other number of seconds
done
# Here the file contains completed
當中的標準工具,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
注意沒有引號!
我在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
可能意味着您錯過了該行,或者在沒有行添加到文件時正在處理該行。
在管道中使用grep
,您可以通過添加--line-buffered
選項打開線路緩衝模式!
如果您希望Completed上的匹配區分大小寫,您可以在grep後添加-i。 – Zugwalt 2011-06-05 20:34:58