如何將五秒的數據附加到文件末尾?

如何將五秒的數據附加到文件末尾?

假設 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

相關內容