일부 텍스트가 나타날 때까지 파일을 보고 싶습니다.
나는 이 대답을 찾았습니다:텍스트가 보일 때까지 `tail -f`
하지만 우분투에서 시도하면 종료되지 않습니다.
$ echo one > test.txt
$ echo two >> test.txt
$ echo three >> test.txt
$ echo four >> test.txt
$ cat test.txt | sed '/w/ q'
one
two
$
예상대로 작동합니다. 그런데 파일을 추적하려고 하면
$ tail -f test.txt | sed '/w/ q'
one
two
그것은 결코 존재하지 않을 것입니다. 파이프가 부러져도 꼬리는 멈추지 않는다.
tail
나갈 때 로그아웃하는 방법 아시는 분 계신가요 ?sed
답변1
이는 다음과 같습니다.
존재하다:
cmd1 | cmd2
cmd1
쉘이 종료되더라도 cmd2
종료될 때까지 기다립니다. 모든 껍질이 이런 것은 아닙니다. 예를 들어 Bourne 또는 Korn과 같은 일부 쉘은 그렇지 않습니다.
죽을 때 cmd2
표준 출력의 파이프는 cmd1
다음과 같습니다.부서진하지만 cmd1
즉시 종료되지는 않습니다.
cmd1
다음 번 파이프에 쓰기 시도 시 종료됩니다. 그런 다음 SIGPIPE를 수신하고 기본 작업은 프로세스를 종료하는 것입니다.
cmd1
== tail -f file
및 cmd2
== 를 사용하면 sed /w/q
파일 tail -f
의 마지막 10줄을 읽고 stdout(파이프)에 기록합니다. 일반적으로 줄이 너무 커서 더 많은 텍스트가 추가될 때까지 기다리지 않는 한 블록에 기록됩니다 file
.
sed
동시에 실행되는 는 표준 입력에서 입력을 기다리고, 읽고, 한 줄씩 처리하며, w
.
라인을 찾으면(또는 일부 구현에서는 단일 라인 지연이 있을 수 있음 sed
) 종료되지만 그때쯤이면 tail
파이프에 쓰는 데 필요한 모든 내용이 작성되었으므로 조금 더 기다리지 않는 한 SIGPIPE를 수신하지 않습니다. 파일에 추가 텍스트를 추가합니다(이 시점에서 치명적인 작업이 수행됩니다 write()
).
cmd1
해지 후 즉시 해지 하고 싶은 경우에는 해지 후 즉시 해지 cmd2
해야 합니다 . cmd2
좋다:
sh -c 'echo "$$"; exec tail -f test.txt' | {
IFS= read pid
sed /w/q
kill -s PIPE "$pid"
}
또는 다음을 사용하여 bash
:
{ sed /w/q; kill -s PIPE "$!"; } < <(exec tail -f text.txt)
2020 에디터
@user414777이 지적했듯이 버전 8.28부터 팔로우 모드의 GNU 구현은 tail
이제 새 데이터를 감시하는 파일을 폴링할 뿐만 아니라 stdout이 손상된 파이프가 되었는지 확인하고 즉시 종료됩니다(또는 1초 내에 종료되는 경우).inotify사용되지 않음), 위의 해결 방법이 불필요해집니다.
그러나 tail
이는 GNU만이 수행하며 다른 구현 tail
(내가 아는 한)이나 다른 유틸리티(GNU 구현도 아님)는 수행하지 않는다는 점에 유의하십시오.
따라서 동시에:
tail -f file | head -n1
한 줄 후에 종료됩니다.
tail -f file | tr '[:lower:]' '[:upper:]' | head -n1
예를 들어, tr
파이프가 파손되었는지 확인하기 위해 표준 출력을 반드시 모니터링할 필요는 없으므로 파손된 경우에만 종료됩니다.쓰다평소처럼 파이프가 끊어진 후에 어떤 일이 일어날 것입니다(그런 다음에야 tail -f
GNU가 종료됩니다).