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

2

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

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

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

Eu não sei se há algum otpion para tail -f , que mostra dados completos.

para entender algo como tail -5 file.txt em que -5 não é o número de linhas mas numere sem segundos.

OBSERVAÇÃO: não quero perder nenhum dado toda vez que ele deve me fornecer os dados de onde ele foi deixado a última vez. Isso é importante.

    
por munish 16.10.2013 / 12:09

3 respostas

3

retail é um estado tail . Ele registra o número do inode e o tamanho do arquivo após cada chamada, a próxima chamada é escolhida de onde parou (opcionalmente, lidando com arquivos girados também, e é por isso que o inode é gravado).

while true; do 
    retail myfile.log
    sleep 5
done

A menos que os dados do arquivo contenham timestamps (pode ser, se for via syslog) ou algum ID crescente monotônico, você deve ter algum estado externo, retail usa o tamanho do arquivo.

Supondo que o arquivo só é anexado e liberado linha por linha, retail não perderá dados. Ele também deve ser mais confiável do que a inspeção de registros de data e hora nos dados, a menos que tenham alta precisão (por exemplo, µs ou melhor precisão).

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

por 16.10.2013 / 13:41
0

Você pode extrair as últimas 5 linhas do script, com tail -n 5 , mas somente a última alteração em um arquivo é sempre timestamped, não há registro de data e hora para cada alteração. Se você quiser recuperar os últimos n segundos, deverá armazená-los separadamente.

Você pode quantificar seus dados. Digamos que a escrita do script, no loop principal, crie uma função que será lançada 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 escreve dados, por ex. com echo , também o 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 pode fazer cat f?.txt para recuperar os últimos 5 segundos de dados.

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

    
por 16.10.2013 / 12:24
0

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
    
por 16.10.2013 / 16:31