Linux 명령을 결합하면 outfile.txt에 기록되지 않습니다.

Linux 명령을 결합하면 outfile.txt에 기록되지 않습니다.

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

나는 이것을 썼다:

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

출력 파일이 생성되었지만 비어 있습니다. >> 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

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

사람들은 sed;

-u, --버퍼링 없음

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

사람 stdbuf;

stdbuf - 명령을 실행하고 표준 스트림 버퍼링 작업을 수정합니다.

-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

관련 정보