나는 다음 문장(간략화된 버전)을 사용하고 있습니다:
tail -f -c+1 <filename>
파일을 프로세스로 파이프하기 위해.
그런데 끝에 파이프로 연결되지 않은 줄이 많다는 걸 발견했습니다.
구체적인 예는 mysql 파일을 파이핑하고 끝에 도달하면 중지하는 것입니다.
tail -f -c+1 mysqdump.sql | sed '/^-- Dump completed/ q0'
이것은 작동하지 않습니다. 덤프의 마지막 줄이 -- Dump completed [...]
sed로 연결되지 않습니다.
내 생각에는 tail -f
이 경우 버퍼가 가득 찼을 때만 플러시되는 것 같습니다.
이 문제를 어떻게 해결할 수 있는지 아는 사람 있나요?
=================
이유를 찾았습니다. 설명이 불완전하고 코드가 동작을 나타내지 않습니다.
이 문제는 압축된(lzma) 파일에서 파이핑할 때 발생합니다.
tail -f -c+1 <filename.lzma> | lzma -d | sed '/^-- Dump completed/ q0'
tail
입력이 바이너리이기 때문에 마지막 압축 청크는 새 줄을 감지하지 못하기 때문에 전송되지 않을 가능성이 큽니다 .
답변1
tail -f
각 입력 라인 후에 새로 고칩니다. strace
(또는 truss
UNIX 변형이 프로세스의 시스템 호출을 추적하기 위해 제공하는 것)을 사용하여 이를 확인할 수 있습니다 .
불완전한 줄이 있으면 tail -f
다음 개행 문자를 계속 기다립니다. 텍스트 파일용으로 특별히 설계된 도구입니다. 후행 바이너리가 필요한 경우(예: -- Dump completed
그 뒤에 개행 문자가 없는 경우) 사용자 정의 도구를 사용해야 합니다.
출력을 터미널에서 다른 방향으로 리디렉션 하면 sed
자체 버퍼링이 수행됩니다. 노력하다stdbuf
또는unbuffer
.
답변2
사용 예 stdbuf -o0
. 인용하다:https://superuser.com/a/1123674/126847
tail -F cpu.log | stdbuf -o0 tr '=' ' ' | stdbuf -o0 awk '$6 > 1'
답변3
질문에서 호출된 명령의 한 가지 문제점은 sed
버퍼링 모드에서 호출된다는 것입니다.
tail -f -c+1 <filename.lzma> | lzma -d | sed '/^-- Dump completed/ q0'
플래그를 추가해야 합니다 -u
.
tail -f -c+1 <filename.lzma> | lzma -d | sed -u '/^-- Dump completed/ q0'
자세한 내용은 -u
스위치 에 대해 읽어보세요.sed
매뉴얼 페이지.