Wie kann ich fünf Sekunden Daten an das Ende der Datei anhängen?

Wie kann ich fünf Sekunden Daten an das Ende der Datei anhängen?

Angenommen, ein Shell-Skript hängt Daten an eine Datei.txt an, wie

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

Jetzt möchte ich ein anderes Skript, das innerhalb von fünf Sekunden die an die Datei „file.txt“ angehängten neuen Daten überprüfen kann, nicht aber die vollständigen Daten.

Ich weiß nicht, ob es eine Option gibt, tail -fdie vollständige Daten anzeigt.

zum Verständnis von etwas wie tail -5 file.txt„-5“ ist nicht die Anzahl der Zeilen, sondern die Zahl ohne Sekunden.

HINWEIS: Ich möchte keine Daten verpassen. Jedes Mal sollen mir die Daten von dort zurückgegeben werden, wo sie beim letzten Mal aufgehört haben. Das ist wichtig.

Antwort1

retailist einStaatsbürgerlich tail. Es zeichnet die Inode-Nummer und die Dateigröße nach jedem Aufruf auf, der nächste Aufruf setzt dort an, wo er aufgehört hat (optional auch bei rotierten Dateien, weshalb der Inode aufgezeichnet wird).

while true; do 
    retail myfile.log
    sleep 5
done

Sofern die Dateidaten selbst keine Zeitstempel (was bei Syslog-Übertragung möglich ist) oder eine monoton ansteigende ID enthalten, müssen Sie über einen externen Status verfügen, der retaildie Dateigröße verwendet.

Vorausgesetzt, die Datei wird immer nur angehängt und zeilenweise geleert, retailgehen keine Daten verloren. Es sollte auch zuverlässiger sein als die Überprüfung von Zeitstempeln innerhalb der Daten, es sei denn, sie haben eine hohe Genauigkeit (z. B. µs oder besser).

retailist in C geschrieben und scheint dem Vorschlag von @Ulrich Dangel zu ähneln logtail. Es scheint zwei verschiedene Versionen davon zu geben, beide in Perl implementiert, von denen ich keine verwendet habe:

Antwort2

Sie können die letzten 5 extrahierenLinienaus dem Skript, wobei tail -n 5jedoch nur die letzte Änderung in einer Datei mit einem Zeitstempel versehen wird, es gibt keinen Zeitstempel für jede Änderung. Wenn Sie die letzte Änderung abrufen möchtenNSekunden, müssen Sie diese selbst separat speichern.

Sie könnten Ihre Daten quantifizieren. Nehmen wir an, das Skript erstellt in der Hauptschleife eine Funktion, die einmal pro Sekunde gestartet wird:

 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

und dort, wo es Daten schreibt, zB mit echo, hängt es diese auch an den Puffer an.

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

(und Schreibvorgänge werden im $BUFFER gespeichert, anstatt in „file.txt“ geschrieben zu werden)

In diesem Fall könnte Ihr Skript cat f?.txtdie letzten 5 Sekunden der Daten abrufen.

Achten Sie natürlich auf Sperren. Wenn ein Skript mitten in der Festplattenoperation eines anderen Skripts liest, werden die Daten beschädigt.

Antwort3

Dies sollte genau das tun, was Sie möchten....

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

verwandte Informationen