Como posso obter cinco segundos de dados anexados ao final do arquivo?

Como posso obter cinco segundos de dados anexados ao final do arquivo?

suponha que se um script de shell anexe dados a um arquivo.txt como

1...........
2...........
3.............
4.............
5..............

Agora eu quero outro script que possa verificar os novos dados anexados ao arquivo.txt em cinco segundos, e não os dados completos.

Não sei se existe alguma opção tail -fque mostre dados completos.

para entender algo como tail -5 file.txtonde -5 não é o número de linhas, mas o número não é de segundos.

NOTA: Não quero perder nenhum dado cada vez que ele me fornecer os dados de onde saiu da última vez.

Responder1

retailé umcom estado tail. Ele registra o número do inode e o tamanho do arquivo após cada invocação, a próxima invocação continua de onde parou (opcionalmente lidando também com arquivos rotacionados, e é por isso que o inode é gravado).

while true; do 
    retail myfile.log
    sleep 5
done

A menos que os próprios dados do arquivo contenham carimbos de data e hora (pode, se for via syslog) ou algum ID crescente monotônico, você deve ter algum estado externo, retailusa o tamanho do arquivo.

Supondo que o arquivo seja anexado e liberado linha por linha, retailnão perderá dados. Também deve ser mais confiável do que inspecionar carimbos de data/hora nos dados, a menos que tenham alta precisão (por exemplo, µs ou melhor precisão).

retailestá escrito em C e parece semelhante à sugestão de @Ulrich Dangel de logtail. Parece haver duas versões distintas disso, ambas implementadas em perl, nenhuma das quais eu usei:

Responder2

Você poderia extrair os últimos 5linhasdo script, com tail -n 5apenas a última alteração em um arquivo com registro de data e hora, não há registro de data e hora para cada alteração. Se você quiser recuperar o últimonsegundos, você mesmo deve armazená-los separadamente.

Você pode quantificar seus dados. Digamos, a escrita do script cria, no loop principal, uma função que será iniciada uma vez por segundo:

 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

e no local onde ele grava os dados, por exemplo, com echo, ele também os anexa ao buffer.

echo $DATA >file.txt
BUFFER=$BUFFER$DATA

(e as gravações são armazenadas no $BUFFER em vez de serem gravadas em 'file.txt`)

Nesse caso, seu script poderia cat f?.txtrecuperar os últimos 5 segundos de dados.

Claro, preste atenção ao bloqueio. Se um script for lido bem no meio da operação de disco de outro script, os dados serão corrompidos.

Responder3

Isso deve fazer exatamente o que você gostaria ....

#!/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

informação relacionada