grep에서 awk로의 파이프가 작동하지 않습니다.

grep에서 awk로의 파이프가 작동하지 않습니다.

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}'

아무리 기다려도 아무 일도 일어나지 않습니다. 나는 이것이 스트림이 작동하는 방식과 관련이 있다고 생각합니다.

누구든지 단서가 있습니까?

답변1

grep의 출력 버퍼일 수 있습니다. 를 사용하여 비활성화할 수 있습니다 grep --line-buffered.

하지만 grep의 출력을 awk로 파이프할 필요는 없습니다. awk는 자체적으로 정규식 패턴 일치를 수행할 수 있습니다.

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

답변2

tail -f test.txt | awk '/Beam/{print $3}'나를 위해 작품을 사용하세요 . tail -f test.txt | grep --line-buffered Beam | awk '{print $3}'(gnu grep)을 사용합니다 .

여기서 문제는 awk데이터를 한 줄씩 받을지 아니면 하나의 큰 덩어리로 받을지 여부입니다. GNU 버전의 grep은 더 효율적이기 때문에 출력을 더 큰 덩어리로 보내지만 한 awk줄씩 출력하려면 한 줄씩 읽어야 합니다.

이렇게 표현하면 grep데이터는 버퍼가 가득 찰 때만 전송됩니다. awk는 해당 버퍼가 가득 찰 때까지 기다리므로 아무 것도 보내지 않습니다.

답변3

--line-buffered옵션을 참조하세요 grep.

관련 정보