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
.