사용 가능합니까 grep
연속 스트림 있습니까?
내가 의미하는 것은 일종의 tail -f <file>
명령이지만 grep
관심있는 줄만 유지하기 위해 출력이 있습니다.
나는 시도 tail -f <file> | grep pattern
했지만 끝났을 grep
때만 실행될 수있는 것처럼 보입니다 tail
.
tail -f file
작품 (실시간으로 새로운 결과를 봅니다)
사용 가능합니까 grep
연속 스트림 있습니까?
내가 의미하는 것은 일종의 tail -f <file>
명령이지만 grep
관심있는 줄만 유지하기 위해 출력이 있습니다.
나는 시도 tail -f <file> | grep pattern
했지만 끝났을 grep
때만 실행될 수있는 것처럼 보입니다 tail
.
tail -f file
작품 (실시간으로 새로운 결과를 봅니다)
답변:
grep
BSD grep (FreeBSD, Mac OS X 등)을 사용할 때의 라인 버퍼링 모드를 켜십시오
tail -f file | grep --line-buffered my_pattern
기본적으로 플러시되므로 GNU grep (거의 모든 Linux에서 사용)에 대해서는이 작업을 수행 할 필요가 없습니다 (SmartOS, AIX 또는 QNX와 같은 다른 유닉스 계열의 경우 YMMV).
strace
. 이 없으면 --line-buffered
작동하지 않습니다.
tail -f | grep
, 그리고 --line-buffered
그것은 나를 해결합니다 (우분투 14.04에를, GNU 그렙 버전 2.16). "stdout이 tty 인 경우 라인 버퍼링 사용"논리는 어디에 구현되어 있습니까? 에서 git.savannah.gnu.org/cgit/grep.git/tree/src/grep.c , line_buffered
만 인수 파서에 의해 설정된다.
--line-buffered
있고 출력이 없습니다. 그러나 테스트 후 GNU grep이 설명하는 것처럼 보입니다. 따라서 대부분의 유닉스와 마찬가지로 플랫폼의 구현에 달려 있습니다. 문제는 플랫폼을 지정하지 않았기 때문에, 당신의 정보를 허위로 표시 - BSD 그렙에 대한 코드를 검토하고 GNU 그렙과 비교 한 후, 동작은 확실히 --line 버퍼 옵션에 의해 제어됩니다. GNU grep 만 기본적으로 플러시됩니다.
나는 tail -f <file> | grep <pattern>
항상 .
grep이 끝날 때까지 기다리지 않고 기다릴 것입니다 (우분투를 사용하고 있습니다).
문제는 grep이 일부 출력 버퍼링을 사용한다는 것입니다. 시험
tail -f file | stdbuf -o0 grep my_pattern
grep의 출력 버퍼링 모드를 unbuffered로 설정합니다.
grep
.
unbuffer
( expect-dev
debian 의 패키지에 있음) king 입니다. 그래서 stdbuf보다 unbuffer를 사용합니다.
top
stdbuf 및 unbuffer와 대화식 비교 ). 그리고 '매직'솔루션은 없습니다. 언 버퍼는 때때로 실패합니다. 예를 들어 awk는 다른 버퍼 구현을 사용합니다 (stdbuf도 실패합니다).
당신은이 답변을 향상으로 생각할 수 있습니다 .. 보통 나는 사용하고 있습니다
tail -F <fileName> | grep --line-buffered <pattern> -A 3 -B 5
파일 회전의 경우 -F가 더 좋습니다 (파일이 회전하면 -f가 제대로 작동하지 않음)
-A와 -B는 패턴 발생 직전과 직후에 라인을 얻는 데 유용합니다.이 블록은 점선 구분 기호 사이에 나타납니다.
하지만 저에게는 다음을 선호합니다
tail -F <file> | less
스트리밍 로그 내부를 검색하려는 경우 매우 유용합니다. 앞뒤로 깊게 쳐다 봐
grep -C 3 <pattern>
N이 같으면 -A <N> 및 -B <N>을 대체합니다.
아무도 내 평소 이동을 제공하는 것을 보지 못했습니다.
less +F <file>
ctrl + c
/<search term>
<enter>
shift + f
ctrl + c
언제든지 파일을 중지하고 탐색 하는 데 사용할 수 shift + f
있으며 실시간 스트리밍 검색으로 돌아 가기 위해 사용할 수 있기 때문에 이것을 선호합니다 .
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 명령은 파이프에서 꼬리 다음에옵니다. 따라서 sed 프로세스 ID는 $ BASHPID + 1입니다.
$BASHPID+1
)은 많은 상황에서 잘못된 것이며, 이는 OP가 요청한 버퍼링 문제를 해결하는 데 아무런 도움이되지 않습니다. 특히, 여기서 추천 sed
하는 grep
것은 단지 (의심스러운) 선호의 문제처럼 보입니다. ( 이것이 당신이 전달하려는 시점이라면 p;q
행동을 얻을 수 있습니다 grep -m 1
.)
--line-buffered
되지 않은 준비가 되 자마자 각 줄을 인쇄합니다 . 나는 마이너스 1을 진지하게 이해하지 못한다.
예, 이것은 실제로 잘 작동합니다. Grep
대부분의 유닉스 명령어는 한 번에 한 줄씩 스트림에서 작동합니다. 꼬리에서 나오는 각 줄은 분석되고 일치하면 전달됩니다.
grep
파이프 체인의 마지막 명령 인 경우 설명대로 작동합니다. 그러나 중간에 있으면 한 번에 약 8k 출력을 버퍼링합니다.
이 명령은 나를 위해 일합니다 (수세) :
mail-srv:/var/log # tail -f /var/log/mail.info |grep --line-buffered LOGIN >> logins_to_mail
메일 서비스에 대한 로그인 수집
당신은 확실히 성공하지 못할 것입니다
tail -f /var/log/foo.log |grep --line-buffered string2search
꼬리의 별칭으로 "colortail"을 사용하는 경우 (예 : bash에서
alias tail='colortail -n 30'
tail isan alias of와 같은 것을 출력하면 type alias로 확인할 수 있습니다. colortail -n 30
. 그럼 당신은 범인이 있습니다 :)
해결책:
로 별칭을 제거
unalias tail
이 명령으로 '실제'꼬리 이진을 사용하고 있는지 확인하십시오.
type tail
다음과 같이 출력되어야합니다 :
tail is /usr/bin/tail
그런 다음 명령을 실행할 수 있습니다
tail -f foo.log |grep --line-buffered something
행운을 빕니다.