연속 스트림을 'grep'하는 방법은 무엇입니까?
grep
연속 스트림 에서 사용할 수 있습니까?
내가 의미하는 것은 일종의 tail -f <file>
명령이지만, grep
내가 관심있는 행만 유지하기 위해 출력에 있습니다.
시도해 tail -f <file> | grep pattern
보았지만 완료 grep
되면 실행될 수있는 것 같습니다 tail
.
grep
BSD 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
'Development Tip' 카테고리의 다른 글
Git에서 로컬 작업 디렉토리를 지우려면 어떻게해야합니까? (0) | 2020.09.30 |
---|---|
쿼리 문자열 매개 변수의 Java URL 인코딩 (0) | 2020.09.30 |
Git에서 HEAD ^와 HEAD ~의 차이점은 무엇입니까? (0) | 2020.09.30 |
“git clone git@remote.git”를 실행할 때 사용자 이름과 비밀번호를 어떻게 제공합니까? (0) | 2020.09.29 |
REST (Representational State Transfer) 및 SOAP (Simple Object Access Protocol) (0) | 2020.09.29 |