
-f 플래그를 사용하여 로그 파일을 추적하고 있습니다. 그런 다음 "X"가 포함된 줄만 찾기 위해 이것을 grep으로 파이프합니다. 완벽하게 작동하고 있어요. 이제 이것을 다시 다른 grep으로 파이프하여 "Y"가 포함된 모든 줄을 제거하고 싶습니다. 두 번째 파이프를 추가하면 파일 새로 고침이 중지되고 데이터가 수신되지 않는 것처럼 보입니다.
작동하는 명령은 다음과 같습니다. tail -f my_file.log | grep "X"
이는 다음을 수행하지 않는 명령입니다. tail -f my_file.log | grep "X" | grep -v "Y"
명령이 작동하려면 어떻게 구성해야 합니까?
답변1
출력이 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'
답변2
나는 일반적으로 awk
이러한 종류의 논리적 검사에 더 유용하다고 생각합니다.
tail -f /path/to/log | awk '/X/ && !/Y/'
# ^^^ ^^^^
# this I want but not this
두 개의 탭을 사용하여 테스트했습니다. 하나는 계속 쓰고 있고 seq 20 >> myfile
다른 하나는 예를 들어 tail -f myfile | awk '/3/ && !/13/'
.
답변3
grep
또 다른 접근 방식은 두 개가 아닌 단일 호출을 사용하여 버퍼링 문제를 방지하는 것입니다. 0개 이상의 Y가 아닌 문자로 구성된 줄과 X, 그리고 다시 줄 끝까지 0개 이상의 Y가 아닌 문자로 구성된 줄을 일치시키는 정규식을 사용하세요."
tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'