버퍼 커팅을 취소하는 방법은 무엇입니까?

버퍼 커팅을 취소하는 방법은 무엇입니까?

내 메일 로그 파일에서 "@xyz.nl"로 끝나는 이메일 주소만 가져오고 싶습니다. 이를 달성하기 위해 다음을 수행합니다.

# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | cut -d '@' -f 1 | cut -d '<' -f 2

grep의 --line-buffered가 필요합니다. 그렇지 않으면 파이프가 터미널로 간주되지 않기 때문에 출력을 버퍼링하기 때문입니다. Grep은 다음과 같은 줄을 출력합니다.

Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<[email protected]>, relay=123.456.123.456[123.456.123.456]:25, delay=2, delays=0.4/0/0.4/1.2, dsn=2.0.0, status=sent (250 2.0.0 u7T9twxN074009 Message accepted for delivery)

첫 번째 컷에서는 다음이 생성됩니다.

Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<someone

두 번째 컷에서는 다음이 생성되어야 합니다.

someone

그러나 컷도 버퍼링되는 것으로 보입니다. 다음으로 명령을 시작하면고양이바꾸다꼬리 -f로그 파일에서 모든 관련 결과(선호하는 형식)를 얻습니다. 하지만 실시간 로그 파일의 결과가 필요합니다.

나는 이것을 달성하기 위해 unbuffer를 사용해 보았습니다.

# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2

또한 시도했습니다:

# unbuffer tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2

...첫 번째 버퍼에서 4K 버퍼를 제거해야 합니다.자르다. 그러나 이것은 작동하지 않습니다. 로컬 도메인을 grep하면 더 많은 히트가 발생하고 버퍼가 더 빨리 채워지며 출력이 더 일찍(4K 배치로) 생성되기 때문에 버퍼링이라는 것을 알고 있습니다.

그래서 내 질문은: 버퍼링을 해제하는 방법입니다.자르다?

관련 항목: sed와 (g)awk가 나에게 이메일 주소를 전달할 수 있다는 것을 알고 있습니다. 노력했지만 아직 결과가 없습니다. sed 또는 (g)awk를 사용하는 답변은 환영하며 즉각적인 문제를 해결할 수 있지만 cut 명령을 버퍼링 해제하는 방법에 대한 질문에 대한 명목상의 답변에는 여전히 관심이 있습니다. 잘라내기 명령에는 버퍼링(비)이 포함되지 않습니다.

답변1

GNU Coreutils(거의 모든 Linux)를 사용하는 경우 다음을 시도해 볼 수 있습니다 stdbuf.

… | stdbuf -oL cut -d '@' -f 1 | …

-oL원하는 대로 행 버퍼링으로 만드세요.

관련 정보