outfile.txt를 쓰지 않는 결합된 Linux 명령

outfile.txt를 쓰지 않는 결합된 Linux 명령

msg="yxyxyx"의 내용을 로그 파일(실시간)에서 검색한 다음 고유 값을 outfile.txt에 쓰고 싶습니다.

나는 이것을 썼다:

tail -f /var/log/firewall.log | sed -n '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | awk '!seen[$0]++' >> outfile.txt

Outfile이 생성되었지만 비어 있습니다. >> outfile.txt 부분 없이 콘솔에 완벽하게 작성됩니다.

감사합니다!

답변1

아래와 같이 awk 명령 앞에 stdbuf -oL 또는 stdbuf -o0을 사용할 수 있습니까?

tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

꼬리 -f 방화벽.log | sed -nu '/msg=/{s/.msg=//;s/\S=.*//;p}' | stdbuf -o0 awk '!seen[$0]++' >> outfile.txt

남자 sed;

-u, --버퍼링되지 않음

입력 파일에서 최소한의 데이터를 로드하고 출력 버퍼를 더 자주 플러시합니다.

남자 stdbuf;

stdbuf - 표준 스트림에 대한 수정된 버퍼링 작업을 사용하여 COMMAND를 실행합니다.

-o, --output=MODE 표준 출력 스트림 버퍼링 조정

MODE가 'L'이면 해당 스트림은 라인 버퍼링됩니다. 이 옵션은 표준 입력에서는 유효하지 않습니다.

MODE가 '0'이면 해당 스트림이 버퍼링되지 않습니다.

예;

먼저 이것을 실행하십시오.

user@h$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

다른 터미널을 실행하세요. echo msg="1" >> firewall.log, 아래와 같이 출력됩니다.

user@h$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

user@host$ cat outfile.txt
1

다시 실행해도 echo msg="1" >> firewall.log출력은 변경되지 않습니다.

이것을 실행한 후; echo msg="2" >> firewall.log, 아래와 같이 출력됩니다.

user@host$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

user@host$ cat outfile.txt

1
2

관련 정보