socat 및 gawk 파이프라인

socat 및 gawk 파이프라인

TCP 스트림을 조작하기 위해 gawk를 사용하려고 합니다. TCP 서버는 공백으로 구분된 텍스트 문자열을 출력합니다. 처음에 추가 문자열을 추가한 다음 나머지 필드를 공백 대신 쉼표로 구분하고 싶습니다. 나는 다음을 시도했습니다 :

socat TCP4:127.0.0.1:8888 - | gawk '{out=""; for(i=1;i<=NF;i++){if (i > 1) {out=out","$i} else out="Hello,"$i}; print out}'

이것은 작동합니다. 하지만 이제 다음과 같이 해당 스트림을 두 번째 소켓으로 리디렉션하고 싶습니다.

socat TCP4:127.0.0.1:5754 PIPE gawk '{out=""; for(i=1;i<=NF;i++){if (i > 1) {out=out","$i} else out="$LZER0,POS,"$i}; print out}' | socat - TCP:127.0.0.1:9999

하지만 127.0.0.1:9999에는 아무것도 없습니다. 다음과 같이 들어보았습니다.

socat tcp-listen:9999,reuseaddr,ignoreeof,fork stdout

하지만 아무것도 아니야.

나는 또 다른 테스트를 수행했습니다.

socat TCP4:127.0.0.1:5754 PIPE gawk '{out=""; for(i=1;i<=NF;i++){if (i > 1) {out=out","$i} else out="$LZER0,POS,"$i}; print out}' | socat - -

하지만 내 표준 출력에는 아무것도 없습니다.

도와주세요?

답변1

gawk출력이 파이프로 들어가고 버퍼를 플러시할 만큼 충분한 출력이 생성되지 않으면 출력이 버퍼링될 가능성이 높습니다.

출력 버퍼를 수동으로 플러시하려면 프로그램 fflush()에서 다음을 사용하십시오.gawk

gawk '{ ... ; print out; fflush() }'

관련 정보