파일 끝에 5초의 데이터를 추가하는 방법은 무엇입니까?

파일 끝에 5초의 데이터를 추가하는 방법은 무엇입니까?

예를 들어 쉘 스크립트가 file.txt에 데이터를 추가한다고 가정합니다.

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

이제 전체 데이터 대신 5초 내에 file.txt에 추가된 새 데이터를 확인할 수 있는 다른 스크립트가 필요합니다.

tail -f전체 데이터를 표시 하는 옵션이 있는지 모르겠습니다 .

-5와 같은 것을 이해하는 데 유용한 것은 tail -5 file.txt줄 수가 아니라 초 수입니다.

참고: 마지막에 남은 데이터를 제공해야 할 때마다 데이터를 놓치고 싶지 않습니다. 이건 중요하다.

답변1

retail상태 저장 tail. 각 호출 후에 inode 번호와 파일 크기를 기록하고 다음 호출은 중단된 부분부터 계속됩니다(선택적으로 회전하는 파일도 처리하므로 inode가 기록됩니다).

while true; do 
    retail myfile.log
    sleep 5
done

retail파일 데이터 자체에 타임스탬프(syslog를 통한 경우일 수 있음)나 단조롭게 증가하는 ID가 포함되어 있지 않은 한 파일 크기를 사용하여 일부 외부 상태가 있어야 합니다 .

파일이 한 줄씩만 추가되고 플러시된다고 가정하면 retail데이터가 손실되지 않습니다. 또한 정밀도가 높지 않은 경우(예: µs 이상) 데이터의 타임스탬프를 확인하는 것보다 더 안정적이어야 합니다.

retailC로 작성되었으며 @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

(그리고 쓰기는 "file.txt"에 쓰는 대신 $BUFFER에 저장됩니다)

이 경우 스크립트는 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

관련 정보