로그 파일에 꼬리를 붙이지 만 특정 줄만 표시


29

-f 플래그로 로그 파일을 마무리하고 있습니다. 그런 다음 grep으로 파이핑하고 "X"가 포함 된 줄만 찾습니다. 완벽하게 작동합니다. 이제 이것을 다른 grep에 다시 파이프하고 싶습니다. 그러면 "Y"가 포함 된 모든 줄이 제거됩니다. 두 번째 파이프를 추가하면 파일 새로 고침이 중지되고 데이터가 나오지 않는 것처럼 보입니다.

이것은 작동하는 명령입니다. tail -f my_file.log | grep "X"

이것은 다음과 같은 명령이 아닙니다 : tail -f my_file.log | grep "X" | grep -v "Y"

명령이 작동하도록 어떻게 구성해야합니까?


1
하나의 파이프로 하나의 파이프를 시도하고 순서를 변경하십시오 tail -f file|grep -v "Y". 출력이 정상이면 추가로 진행하십시오 grep "X".
Aizuddin Zali

답변:


38

의 출력 grep이 버퍼링 됨에 따라 --line-buffered옵션 grep을 사용하여 라인 버퍼링을 활성화하십시오.

tail -f /path/to/log | grep --line-buffered 'X' | grep -v 'Y'

grep옵션이없는 경우 stdbuf대안으로 사용할 수 있습니다 .

tail -f /path/to/log | stdbuf -oL grep 'X' | grep -v 'Y'

1
나는 얼마나 궁금 stdbuf알려줍니다 libstdbuf.so사용할 설정을.
kasperd

@kasperd : 환경 변수.
Nate Eldredge

1
@ NateEldredge 나는 이미 출력에서 ​​환경 변수를 diff -u <(env) <(stdbuf env)찾고 아무것도 찾지 못했습니다. 그러나 이제는 내가 테스트해야 할 것이라는 것을 알고 diff -u <(env) <(stdbuf -oL env)있습니다.
kasperd

나는 또한 같은 종류의 문제입니다. 제 경우는 'aaa'와 'bbb'를 포함하는 모든 줄을 인쇄해야합니다. 위의 첫 번째 해결책이 작동하지 않습니다. 두 번째 솔루션은 'aaa'존재하고 'bbb'존재하지 않습니다. 둘 다 작동하지 않습니다. 출력하지 않습니다. 내 명령은 다음과 같습니다 : tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb' 출력을주지 않습니다. 저 좀 도와 주 시겠어요.
일요일

18

나는 보통 awk이런 종류의 논리적 검사에 더 유용하다고 생각 합니다.

tail -f /path/to/log | awk '/X/ && !/Y/'
#                           ^^^    ^^^^
#                   this I want    but not this

두 개의 탭 (하나는 계속 쓰는 탭)으로 테스트 seq 20 >> myfile 다른 하나는 예를 들어 tail -f myfile | awk '/3/ && !/13/'있습니다.


15

또 다른 방법은 grep두 가지 대신 단일 호출 을 사용 하여 버퍼링 문제를 피하는 것입니다. "Y가 아닌 문자가 0 개 이상인 행과 일치하는 정규식을 사용하고 그 다음에 행이 끝날 때까지 X를 누른 다음 0이 아닌 Y가 아닌 문자를 다시 사용하십시오."

tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.