나는 tail과 같은 프로그램을 사용하여 기록되는 파일을 추적하지만 최신 행을 표시하지 않고 싶습니다.
예를 들어, 새 파일에 초점을 맞출 때 파일의 행이 30줄 미만이면 텍스트가 표시되지 않습니다. 30줄 이상의 파일을 쓰면 첫 번째 줄부터 화면에 쓰여집니다.
따라서 31-40행이 파일에 기록되면 1-10행도 화면에 기록됩니다.
tail로 이 작업을 수행하는 쉬운 방법이 없다면 첫 번째 파일이 한 줄을 확장할 때마다 첫 번째 파일의 이전 줄을 새 파일에 쓰고 새 파일의 tail을 작성하는 방법이 있을 수 있습니다.
답변1
@muru와 동일하지만 저장 및 삭제 대신 모듈로 연산자를 사용합니다.
tail -fn+1 some/file | awk -v n=30 '
NR > n {print s[NR % n]}
{s[NR % n] = $0}
END{for (i = NR - n + 1; i <= NR; i++) print s[i % n]}'
답변2
awk 버퍼링을 사용할 수도 있습니다.
tail -n +0 -f some/file | awk '{b[NR] = $0} NR > 30 {print b[NR-30]; delete b[NR-30]} END {for (i = NR - 29; i <= NR; i++) print b[i]}'
awk 코드, 확장자:
{
b[NR] = $0 # save the current line in a buffer array
}
NR > 30 { # once we have more than 30 lines
print b[NR-30]; # print the line from 30 lines ago
delete b[NR-30]; # and delete it
}
END { # once the pipe closes, print the rest
for (i = NR - 29; i <= NR; i++)
print b[i]
}
답변3
이는 파일을 마지막으로 읽은 후 2초 후에 다시 읽기 때문에 매우 효율적이지 않으며 출력이 너무 빠르면 줄을 놓칠 수 있지만 그렇지 않으면 작업을 수행합니다.
watch 'tail -n40 /path/to/file | head -n10'
답변4
파일을 추적하는 방법에 따라 다르지만 다음과 같이 가장 간단하게 추적할 수 있다고 생각합니다.
tail -n0 -F path/to/my/file.log
위 코드를 실행할 때 프로세스가 파일 끝에 줄을 추가하면(예: ./run_process.sh >> file.log
) 파일을 기록하는 대부분의 애플리케이션과 마찬가지로 가장 최근에 추가된 줄만 가져옵니다.