최신 줄을 표시하지 않고 파일을 추적하려면 "tail"을 사용하십시오.

최신 줄을 표시하지 않고 파일을 추적하려면 "tail"을 사용하십시오.

나는 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) 파일을 기록하는 대부분의 애플리케이션과 마찬가지로 가장 최근에 추가된 줄만 가져옵니다.

관련 정보