tail -f의 파이프가 있는 grep 및 sed가 캐싱 중인 것으로 보입니다.

tail -f의 파이프가 있는 grep 및 sed가 캐싱 중인 것으로 보입니다.

특수 로그를 모니터링하기 위해 작동하는 시스템을 얻으려고 노력 중입니다. 나는 일반적 grep으로 에서 파이프를 사용하여 추출하는 매우 구체적인 패턴을 원합니다 tail -f. 나는 grep이 모든 것을 출력하지 않고 대신 일부 라인을 버퍼링된 상태로 유지한다는 것을 알았습니다. 모든 것을 출력한 다음 스트림을 종료하고 닫는 파이프가 있다면 그것은 의미가 있다고 생각합니다.
그러나 tail -f그것은 나에게 적합하지 않습니다.

에도 동일한 문제가 나타납니다 sed.

다음은 제가 사용하고 싶은 명령의 예입니다:

clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g | grep -E --color 'ssh-iptables-perma|$'

예를 들면 다음과 같습니다.

위 명령의 마지막 줄은 다음과 같습니다.

2015-05-04 11:17:24,551 [ssh-iptables] Ban x.x.x.x

그리고 다음 명령을 사용합니다.

clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g

마지막 줄은 이렇습니다.

2015-05-04 19:45:17,615 [ssh-iptables] Ban y.y.y.y

추가 파이프를 제거하면 가장 최근 항목으로 이동하게 됩니다.

파이프에서 이러한 캐싱을 어떻게 방지할 수 있습니까?

답변1

grep의 옵션 --line-bufferedsed의 옵션을 추가합니다 --unbuffered.

답변2

grep님의 옵션을 사용하세요 --line-buffered.

기본적으로 유틸리티는 표준 출력이 터미널인 경우 라인 버퍼링을 사용하지만 출력이 파일 설명자나 파이프에 연결된 경우에는 더 큰 버퍼(대개 4 또는 8kB)를 사용합니다.

tail -F기본적으로 라인 버퍼링을 사용하고 grep이를 활성화하는 명령줄 옵션이 있다는 것은 행운입니다 . 임의의 명령에 대해 라인 버퍼링을 활성화하는 일반적인 방법을 알지 못합니다.

관련 정보