grep에서 awk로 파이핑이 작동하지 않음


34

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

내가 만약 greptail:

$ tail -f test.txt | grep Beam
Beam goes blah
Beam goes what?
Beam goes okay
Beam goes bye
^C

하지만 만약 awkgrep:

$ tail -f test.txt | grep Beam | awk '{print $3}'

아무리 기다려도 아무 문제가 없습니다. 스트림 작동 방식과 관련이 있다고 생각합니다.

누구 단서가 있습니까?

답변:


55

아마도 grep에서 출력 버퍼링 일 것입니다. 으로 비활성화 할 수 있습니다 grep --line-buffered.

그러나 grep의 출력을 awk로 파이프 할 필요는 없습니다. awk는 정규 표현식 패턴 자체를 모두 수행 할 수 있습니다.

tail -f test.txt | awk '/Beam/ {print $3}'


8

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는 해당 버퍼가 채워지기를 기다리고 있으므로 아무것도 보내지 않습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.