
쉘 스크립트가 다음과 같이 file.txt에 데이터를 추가한다고 가정하십시오.
1...........
2...........
3.............
4.............
5..............
이제 나는 완전한 데이터가 아닌 5초 이내에 file.txt에 추가된 새로운 데이터를 확인할 수 있는 또 다른 스크립트를 원합니다.
tail -f
완전한 데이터를 표시하는 옵션이 있는지 모르겠습니다 .
tail -5 file.txt
-5가 줄 수가 아니라 초가 아닌 숫자를 이해하기 위한 것입니다 .
참고: 마지막으로 떠난 위치에서 데이터를 제공해야 할 때마다 데이터를 놓치고 싶지 않습니다. 이것이 중요합니다.
답변1
retail
는상태 저장 tail
. 각 호출 후에 inode 번호와 파일 크기를 기록하고, 다음 호출은 중단된 위치부터 시작합니다(선택적으로 회전된 파일도 처리하므로 inode가 기록됩니다).
while true; do
retail myfile.log
sleep 5
done
파일 데이터 자체에 타임스탬프(syslog를 통한 경우일 수 있음)나 단조롭게 증가하는 ID가 포함되어 있지 않은 한, retail
파일 크기를 사용하는 외부 상태가 있어야 합니다.
파일이 한 줄씩 추가되고 플러시된다고 가정하면 retail
데이터가 손실되지 않습니다. 또한 정밀도가 높지 않은 경우(예: µs 또는 더 나은 정밀도) 데이터 내의 타임스탬프를 검사하는 것보다 더 안정적이어야 합니다.
retail
는 C로 작성되었으며 @Ulrich Dangel의 logtail
. 여기에는 두 가지 버전이 있는 것으로 보입니다. 둘 다 Perl로 구현되었으며 둘 중 어느 것도 사용하지 않았습니다.
답변2
마지막 5개를 추출할 수 있습니다.윤곽스크립트에서는 tail -n 5
파일의 마지막 변경 사항에만 타임스탬프가 기록되며 각 변경 사항에 대한 타임스탬프는 없습니다. 마지막으로 검색하고 싶다면N초 단위로 별도로 보관해야 합니다.
데이터를 수량화할 수 있습니다. 스크립트 작성이 메인 루프에서 1초에 한 번씩 실행되는 함수를 생성한다고 가정해 보겠습니다.
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