2012-07-25 60 views
1

我有一個文本源(一個日誌文件),它獲得由第三方附加到它的新行。有沒有辦法創建一個awk輸入不活動計時器?

我可以使用tail -f source輸出添加到我的源文件。然後,我可以通過awk腳本通過管道來解析和格式化輸出。

我的問題是:當tail -f source | awk -f parser.awk運行時,有沒有辦法每次有什麼不通過管道進入的awk腳本的標準輸入經過5秒以上時間打電話給我function foo()腳本parser.awk裏面?

編輯:目前正在使用GNU Awk 3.1.6。如果需要,可以升級到更新的版本。

+0

最好用'awk --version'的輸出來更新你的問題。也就是說,你不可能用awk解決這個問題。祝你好運。 – shellter 2012-07-25 14:24:35

回答

1

如果你的shell read支持-t-u,這裏是一個醜陋的黑客:

{ echo hello; sleep 6; echo world; } | awk 'BEGIN{ 
    while("while read -t 5 -u 3 line; do echo \"$line\"; done" | getline > 0) 
     print 
    }' 3<&0 

您可以用您的腳本,同時循環體更換print。但是,將tail和awk之間的讀取超時設置在流水線中可能會更有意義,重新實現尾部超時會更有意義。

+0

謝謝。試過了,它說「你好」。現在我不想停下來,只是打印,說「5秒」,然後繼續。所以預期的輸出是「你好\ n5秒\ n世界」。因此,我嘗試了'BEGIN {while(1){<你原來的block while>;打印「5秒」}}'。但是這並沒有阻止'while-read'讀取第二個硬幣,並且我在緊密的循環中得到「5秒」輸出。你能幫我解決我錯過的事情嗎?我對這裏的一切都不太熟悉。 – Balint 2012-07-25 15:53:36

+0

你可以做'while:';請閱讀-t 5 -u 3行&& echo \「$ line \」||回聲超時; done' – 2012-07-25 16:12:40

1

不完全是你的問題的答案。但是,有殼一個小黑客工具,幾乎可以你想要什麼:

{ tail -f log.file >&2 | { while : ; do sleep 5; echo SECRET_PHRASE ; done ; } ; } 2>&1 | awk -f script.awk 

當AWK接收SECRET_PHRASE它將運行每5秒鐘foo功能。不幸的是,即使在這段時間內從尾部出現一些輸出的情況下,它也會每5秒運行一次。

ps。您可以用'()'替換'{}',反之亦然。在第一種情況下,它不會創建子shell,在第二種情況下它會。

另一種方法是將這個祕密短語直接附加到日誌文件,以防在最後5秒鐘內沒有人寫入。但看起來這不是個好主意,因爲你將會損壞日誌文件。

相關問題