netcat 출력을 grep하는 방법


13

의 라이브 텍스트 스트림을 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|

2
아마도 파이프에 버퍼링됩니까? 당신은 시도 할 수 있습니다 stdbuf -o0 netcat localhost 9090 | grep sender( 여기 에서 찍은 )
user43791

이렇게 작동합니까? netcat -z localhost 9090 | grep sender
Gilles Quenot

@ user43791 출력은 여전히 비어,하지만 난 netcat을 일치하는 문자열을 반환 확신
tomekceszke

@sputnick 이것은 즉시 쉘로
돌아가고

1
16 진수 덤프에는 새로운 줄이 없으므로 grep줄 바꿈을 끝없이 기다리고 있습니다. cat이후 작동 grep적어도 EOF하지 않을 경우 줄 바꿈을 얻을 것이다. 아마 시도 awk{RS로?
muru

답변:


4

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

이 스크립트는 균형 조정 {및을 사용 하여 모든 전체 출력을 인쇄해야 }하지만 원하는대로 수행하도록 스크립트를 변경할 수 있습니다. 이 스크립트는 거의 모든 것에 비해 벤치 마크에서 잘 수행되지 않지만 매우 간단하고 나에게 효과가있는 것 같습니다 ...

테스트 샘플 {과 일치하지 않았 }으므로이 값이 실제 입력 인 경우 기준을 변경하여 행을 인쇄 할 수 있습니다.


일치하지 않는 괄호는 출력의 시작 부분 만 게시했기 때문입니다.
Barmar

8

답은 여기에 있습니다 : grep이 nc 출력에서 ​​일치하지 않습니다

netcat은 상세 로그를 표준 오류로 출력하므로 grep으로 파이프하기 전에 오류를 캡처해야합니다.

$ netcat -zv localhost 1-9000 2>&1 | grep succeeded

이 대답은 방금 해결책을 만들었습니다. 없이 명령을 실행하면 매우 이상 2>&1했습니다. grep이 전혀 작동하지 않는 것처럼 보입니다.
Marecky

2

문제는 netcat출력 에 줄 바꿈이 없다는 것입니다 . 두 가지 해결 방법을 볼 수 있습니다.

  1. x초 마다 줄 바꿈을 삽입하십시오 (줄 바꿈이 중간에 삽입되면 불행한 결과가 발생합니다 source).

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

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

여전히 빈 출력입니다. 명령이 올바른지 확인하기 위해 덤프 된 스트림에서 실행합니다 cat netcat_output | awk -v RS='}' -v ORS='}' '/sender/'. 출력이 ,"sender":"xbmc"}
정상입니다

방금 첫 번째 해결 방법을 확인 했는데 작동합니다 ! 그러나 언급했듯이 출력을 분할하여 최종 솔루션이 될 수 없습니다. 어쨌든 많은 감사합니다!
tomekceszke

1

--line-buffered출력에서 라인 버퍼링을 사용하려면 다음 을 추가하십시오 .

netcat localhost 9090 | grep --line-buffered sender 

나는 이미 이것을 시도했지만 작동하지 않았다.
tomekceszke

1

사용 watch명령 :

watch 'netcat localhost 9090 | grep sender'

작동하지 않습니다. sed와 동일하지만 ... 예를 들어 다음과 같습니다. netcat localhost 9090 | hexdump가 작동하고 텍스트를 16 진 라이브로 대체하는 이유는 무엇입니까?
tomekceszke


0

Bash에서는 의사 장치 파일 을 사용하여 TCP 연결을 열고 평소처럼 grep 할 수 있습니다. 예를 들면 다음과 같습니다.

$ grep "sender" < /dev/tcp/example.com/1234

테스트하려면 간단히 다음과 같은 파일을 보낼 수있는 서버를 실행하십시오.

$ nc -vl 1234 < /etc/hosts

그런 다음 다른 터미널에서 테스트를 grep출력으로 실행하십시오 .

$ grep "127" < /dev/tcp/localhost/1234
127.0.0.1   localhost
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.