에서 라이브 텍스트 스트림을 가져오려고 하는데 netcat
작동하지 않습니다.
netcat localhost 9090 | grep sender
아무것도 반환되지 않지만 반드시 반환되어야 한다고 확신합니다.
netcat
출력을 파일로 리디렉션하고 실제 환경을 시뮬레이션하기 위해 약간의 지연을 추가하면 작동합니다 .
$ (sleep 5; cat netcat_output; sleep 5) | grep sender
{"jsonrpc":"2.0","method":"GUI.OnScreensaverDeactivated","params":{"data": "shuttingdown":false},"sender":"xbmc"}}
나는 또한 --line-buffered
성공하지 못한 채 추가를 시도했습니다.
내가 뭘 잘못했나요?
편집하다:
나는 같은 문제를 발견했습니다 sed
. 출력이 비어 있습니다.
그러나 예를 들어 hexdump
텍스트를 16진수로 변환하는 경우는 다음과 같습니다.
$ netcat localhost 9090 | hexdump -C
00000000 7b 22 6a 73 6f 6e 72 70 63 22 3a 22 32 2e 30 22 |{"jsonrpc":"2.0"|
00000010 2c 22 6d 65 74 68 6f 64 22 3a 22 50 6c 61 79 65 |,"method":"Playe|
00000020 72 2e 4f 6e 50 6c 61 79 22 2c 22 70 61 72 61 6d |r.OnPlay","param|
00000030 73 22 3a 7b 22 64 61 74 61 22 3a 7b 22 69 74 65 |s":{"data":{"ite|
00000040 6d 22 3a 7b 22 69 64 22 3a 36 2c 22 74 79 70 65 |m":{"id":6,"type|
00000050 22 3a 22 6d 6f 76 69 65 22 7d 2c 22 70 6c 61 79 |":"movie"},"play|
00000060 65 72 22 3a 7b 22 70 6c 61 79 65 72 69 64 22 3a |er":{"playerid":|
00000070 31 2c 22 73 70 65 65 64 22 3a 31 7d 7d 2c 22 73 |1,"speed":1}},"s|
답변1
대답은 여기에 있습니다: grep이 nc 출력에서 일치하지 않습니다
netcat은 자세한 로그를 표준 오류로 출력하므로 grep으로 파이프하기 전에 오류를 잡아야 합니다.
$ netcat -zv localhost 1-9000 2>&1 | grep succeeded
답변2
read
다음 명령( bash
내장) 을 사용하여 문자를 하나씩 강제로 읽을 수 있습니다 .
netcat localhost 9090 | (
cnt=0
line=
while read -N 1 c; do
line="$line$c"
if [ "$c" = "{" ]; then
cnt=$((cnt+1))
elif [ "$c" = "}" ]; then
cnt=$((cnt-1))
if [ $cnt -eq 0 ]; then
printf "%s\n" "$line"
line=
fi
fi
done
) | grep sender
스크립트는 균형을 사용 {
하고 모든 전체 출력을 인쇄 해야 }
하지만 원하는 대로 스크립트를 변경할 수 있습니다. 이 스크립트는 거의 모든 것에 비해 벤치마크에서 잘 수행되지 않지만 매우 간단하고 저에게는 작동하는 것 같습니다...
테스트 샘플에는 일치하는 {
및 가 없으므로 }
실제 입력의 경우 해당 줄을 인쇄하기 위한 조건을 변경해야 할 수도 있습니다.
답변3
나는 문제가 출력에 개행 문자가 부족하다고 생각합니다 netcat
. 두 가지 해결 방법을 볼 수 있습니다.
매초마다 개행 문자를 삽입합니다
x
(개행 문자가 중간에 삽입되면 불행한 결과가 발생합니다source
).( while sleep 1; do echo; done & netcat ... ) | grep source
awk
줄 바꿈 이외의 RS와 함께 사용:netcat ... | awk -v RS='}' -v ORS='}' '/source/'
답변4
~에 따르면@user43791 댓글, 노력하다파이프에서 버퍼링 비활성화,예를 들어:
stdbuf -o0 netcat localhost 9090 | grep sender