Development Tip

연속 스트림을 'grep'하는 방법은 무엇입니까?

yourdevel 2020. 9. 30. 11:32
반응형

연속 스트림을 'grep'하는 방법은 무엇입니까?


grep연속 스트림 에서 사용할 수 있습니까?

내가 의미하는 것은 일종의 tail -f <file>명령이지만, grep내가 관심있는 행만 유지하기 위해 출력에 있습니다.

시도해 tail -f <file> | grep pattern보았지만 완료 grep되면 실행될 수있는 것 같습니다 tail.


grepBSD grep (FreeBSD, Mac OS X 등)을 사용할 때의 라인 버퍼링 모드를 켭니다 .

tail -f file | grep --line-buffered my_pattern

GNU grep (대부분의 Linux에서 사용됨)에 대해서는 기본적으로 플러시되므로이 작업을 수행 할 필요가 없습니다 (SmartOS, AIX 또는 QNX와 같은 다른 Unix 유사 제품의 경우 YMMV).


나는 tail -f <file> | grep <pattern>항상 사용합니다 .

끝날 때까지가 아니라 grep이 플러시 될 때까지 기다립니다 (우분투를 사용하고 있습니다).


문제는 grep이 출력 버퍼링을 사용한다는 것입니다. 시험

tail -f file | stdbuf -o0 grep my_pattern

grep의 출력 버퍼링 모드를 unbuffered로 설정합니다.


대부분의 경우 할 수 tail -f /var/log/some.log |grep foo있으며 잘 작동합니다.

실행중인 로그 파일에서 여러 greps를 사용해야하고 출력이 표시되지 않는 경우 다음과 같이 --line-buffered스위치를 중간 grep 에 고정해야 할 수 있습니다 .

tail -f /var/log/some.log | grep --line-buffered foo | grep bar

전체 파일 (꼬리뿐만 아니라) 에서 일치하는 항목을 찾고 있고 새 일치 항목이있을 때까지 기다리도록하려면 다음과 같이 잘 작동합니다.

tail -c +0 -f <file> | grep --line-buffered <pattern>

-c +0플래그는 출력을 시작해야 함을 말한다 0바이트 ( -c시작 (에서) +파일을).


아무도 이것에 대해 내 평소의 이동을 제공하는 것을 보지 못했습니다.

less +F <file>
ctrl + c
/<search term>
<enter>
shift + f

ctrl + c언제든 파일을 중지하고 탐색 한 다음 shift + f을 눌러 라이브 스트리밍 검색으로 돌아갈 수 있기 때문에 이것을 선호합니다 .


이 답변을 향상으로 간주 할 수 있습니다. .. 일반적으로 사용하고 있습니다

tail -F <fileName> | grep --line-buffered  <pattern> -A 3 -B 5

-F 파일 회전의 경우 더 좋습니다 (파일 회전시 -f가 제대로 작동하지 않음)

-A 및 -B는 패턴 발생 직전과 직후에 줄을 가져 오는 데 유용합니다.이 블록은 점선 구분 기호 사이에 나타납니다.

하지만 저에게는 다음을 선호합니다.

tail -F <file> | less

스트리밍 된 로그 내부를 검색하려는 경우 매우 유용합니다. 앞뒤로 가서 깊이 봐


sed 가 더 나은 선택이 될 것입니다 ( 스트림 편집기)

tail -n0 -f <file> | sed -n '/search string/p'

특정 문자열을 찾으면 tail 명령을 종료하려면 다음을 수행하십시오.

tail --pid=$(($BASHPID+1)) -n0 -f <file> | sed -n '/search string/{p; q}'

분명히 bashism : $ BASHPID는 tail 명령의 프로세스 ID입니다. sed 명령은 파이프에서 tail 뒤에 있으므로 sed 프로세스 ID는 $ BASHPID + 1이됩니다.


예, 이것은 실제로 잘 작동합니다. Grep대부분의 Unix 명령은 한 번에 한 줄씩 스트림에서 작동합니다. 꼬리에서 나오는 각 줄은 분석되고 일치하면 전달됩니다.


이 명령은 나를 위해 작동합니다 (Suse).

mail-srv:/var/log # tail -f /var/log/mail.info |grep --line-buffered LOGIN  >> logins_to_mail

메일 서비스에 대한 로그인 수집


라인 버퍼링 옵션이없는 경우 grep 대신 awk (또 다른 훌륭한 bash 유틸리티)를 사용하십시오! 꼬리에서 데이터를 지속적으로 스트리밍합니다.

이것이 grep을 사용하는 방법입니다.

tail -f <file> | grep pattern

이것이 awk를 사용하는 방법입니다.

tail -f <file> | awk '/pattern/{print $0}'

참고 URL : https://stackoverflow.com/questions/7161821/how-to-grep-a-continuous-stream

반응형