새 줄 없이 스트림에서 grep을 수행할 수 있습니까?

새 줄 없이 스트림에서 grep을 수행할 수 있습니까?

이 코드를 실행할 때:

while true; do printf "Match Unmatch\n"; sleep 1s; done | grep -o "Match"

터미널에서 grep다음과 같은 단어를 찾으 Match세요.

Match
Match
Match
...

그러나 다음 코드를 실행하면 :

while true; do printf "Match Unmatch"; sleep 1s; done | grep -o "Match"

그런 다음 grep아무것도 발견되지 않는 것 같습니다. 적어도 아무것도 인쇄되지 않습니다. grep이 결코 오지 않는 개행 문자를 기다리고 있습니까? grep, sed 또는 유사한 도구가 개행 없이 스트림에서 일치 항목을 캡처하도록 하는 방법이 있습니까?

답변1

Grep은 기본적으로 주어진 패턴과 일치하는 행을 찾습니다. 패턴에 따라 전체 행을 보지 않고는 행이 일치하는지 여부를 판단하는 것이 불가능할 수도 있습니다. 에서는 grep Match가능 하지만 grep 'Match$'에서는 불가능합니다. grep을 사용하면 grep -o Matchgrep이 Match보자마자 인쇄 할 수 있지만 grep -E -o '(Match)+'grep을 사용하면 이를 따라갈지 MatchMa여부를 알 수 없습니다 .tch

Grep은 전체 라인이 표시되기 전에 일부 출력이 기록될 수 있는 특별한 경우를 구현하지 않습니다. (실현은 아닌거 같은데어느이것은 특별한 경우이지만 확실하지는 않습니다. GNU grep에는 모드에 따라 약간 다르게 동작하는 여러 모드가 있습니다. ) 일치를 시도하기 전에 전체 줄만 읽습니다.

일치하는 텍스트에 전혀 나타나지 않고 일치하는 항목 사이에 항상(또는 적어도 자주) 나타나는 문자가 있는 경우 해당 문자를 개행 문자로 변환합니다. (또는 널 바이트로 가서 그것을 사용하십시오 grep -z.)

while true; do printf "Match Unmatch"; sleep 1s; done | stdbuf -o0 tr ' ' '\n' | grep -o "Match"

출력 버퍼링을 stdbuf -o0방지 하려면 이 기능을 주의해서 사용하세요 . trgrep의 출력을 파이프하거나 ( buffered) 사용하는 경우에도 grep이 필요합니다 grep --line-buffered.--line-buffered산출grep의 경우 grep이 입력을 읽는 방식에 영향을 주지 않으며 grep이 터미널에 인쇄할 때 기본적으로 켜져 있습니다. )

관련 정보