
假設 shell 腳本將資料附加到 file.txt 中,例如
1...........
2...........
3.............
4.............
5..............
現在我想要另一個腳本,可以在五秒鐘內檢查附加到 file.txt 的新數據,而不是完整數據。
我不知道是否有任何選項可以tail -f
顯示完整的數據。
用於理解諸如tail -5 file.txt
-5 不是行數而是秒數之類的內容。
注意:我不想錯過任何數據,每次它都應該給我上次留下的數據。
答案1
retail
是一個有狀態的 tail
。它在每次呼叫後記錄 inode 編號和檔案大小,下一次呼叫將從中斷處繼續(也可以選擇處理旋轉文件,這就是記錄 inode 的原因)。
while true; do
retail myfile.log
sleep 5
done
除非檔案資料本身包含時間戳記(如果是通過系統日誌,則可能會)或一些單調遞增的 ID,否則您必須有一些外部狀態,retail
使用檔案大小。
假設檔案僅被追加並逐行刷新,retail
不會遺失資料。它還應該比檢查資料中的時間戳記更可靠,除非它們具有高精度(例如 µs 或更好的精度)。
retail
是用 C 寫的,看起來類似 @Ulrich Dangel 的建議logtail
。似乎有兩個不同的版本,都是用 perl 實現的,我都沒有使用過:
答案2
您可以提取最後 5 個線從腳本中,tail -n 5
只有文件中的最後一個更改帶有時間戳,每個更改都沒有時間戳。如果你想檢索最後一個n秒,您必須自己單獨儲存它們。
您可以量化您的數據。比如說,腳本編寫確實在主循環中創建了一個每秒啟動一次的函數:
CSEC=`date +%S`
if [ "x$CSEC" != "x$SAVEDSEC" ] ; then
mv f4.txt f5.txt
mv f3.txt f4.txt
mv f2.txt f3.txt
mv f1.txt f2.txt
echo $BUFFER > f1.txt
BUFFER=
SAVEDSEC=$CSEC
fi
在寫入資料的地方,例如使用echo
,它也將其附加到緩衝區。
echo $DATA >file.txt
BUFFER=$BUFFER$DATA
(並且寫入儲存在 $BUFFER 中而不是寫入“file.txt”)
在這種情況下,您的腳本可以cat f?.txt
檢索最後 5 秒的資料。
當然,要注意鎖定。如果一個腳本在另一個腳本的磁碟操作中間讀取數據,則資料將被損壞。
答案3
這應該完全符合您的要求...
#!/bin/bash
#This is the file we want to capture data from
TAILFILE=/path/to/input.txt
#This is the file we want to append to
OUTFILE=/path/to/output.txt
#How many seconds we want to tail the file
SECONDS=5
tail -F $TAILFILE >> $OUTFILE &
PID=$!
sleep $SECONDS
kill $PID