netcat 출력을 grep하는 방법

netcat 출력을 grep하는 방법

에서 라이브 텍스트 스트림을 가져오려고 하는데 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. 두 가지 해결 방법을 볼 수 있습니다.

  1. 매초마다 개행 문자를 삽입합니다 x(개행 문자가 중간에 삽입되면 불행한 결과가 발생합니다 source).

    ( while sleep 1; do echo; done & netcat ... ) | grep source
    
  2. awk줄 바꿈 이외의 RS와 함께 사용:

    netcat ... | awk -v RS='}' -v ORS='}' '/source/'
    

답변4

~에 따르면@user43791 댓글, 노력하다파이프에서 버퍼링 비활성화,예를 들어:

stdbuf -o0 netcat localhost 9090 | grep sender

관련 정보