grep
진행중인 tail
파일 로그를 시도 n
하고 줄에서 단어를 얻습니다 . 예제 파일 :
$ cat > test.txt <<EOL
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
EOL
^C
이제 내가하면 tail
:
$ tail -f test.txt
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
^C
내가 만약 grep
그 tail
:
$ tail -f test.txt | grep Beam
Beam goes blah
Beam goes what?
Beam goes okay
Beam goes bye
^C
하지만 만약 awk
그 grep
:
$ tail -f test.txt | grep Beam | awk '{print $3}'
아무리 기다려도 아무 문제가 없습니다. 스트림 작동 방식과 관련이 있다고 생각합니다.
누구 단서가 있습니까?
답변
아마도 grep에서 출력 버퍼링 일 것입니다. 으로 비활성화 할 수 있습니다 grep --line-buffered
.
그러나 grep의 출력을 awk로 파이프 할 필요는 없습니다. awk는 정규 표현식 패턴 자체를 모두 수행 할 수 있습니다.
tail -f test.txt | awk '/Beam/ {print $3}'
답변
tail -f test.txt | awk '/Beam/{print $3}'
나를 위해 작품을 사용 합니다. tail -f test.txt | grep --line-buffered Beam | awk '{print $3}'
(gnu grep) 을 사용할뿐만 아니라
여기서 문제 awk
는 데이터를 한 줄씩 또는 하나의 더 큰 데이터 블록으로 수신 한 경우 입니다. grep의 GNU 버전은 더 효율적이기 때문에 더 큰 블록으로 출력을 보내지 만, awk
한 줄씩 출력하려면 한 줄씩 읽어야합니다.
이 방법을 넣으십시오 : grep
버퍼가 채워질 때만 데이터를 보내고 awk는 해당 버퍼가 채워지기를 기다리고 있으므로 아무것도 보내지 않습니다.
답변
--line-buffered
옵션을 참조하십시오 grep
.