कैसे netcat उत्पादन grep करने के लिए


13

मैं लाइव पाठ स्ट्रीम को प्राप्त करने की कोशिश कर रहा हूं 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लेकिन w / o सफलता।

मैं क्या गलत करूँ?

संपादित करें:

मैं एक ही मुद्दे के साथ देखा sed, उत्पादन खाली है।

लेकिन, उदाहरण के लिए, hexdumpपाठ को हेक्स लाइव में कनवर्ट करता है:

$ 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
गाइल्स क्वेनोट

@ user43791 आउटपुट अभी भी खाली है, लेकिन मुझे यकीन है कि netcat मिलान स्ट्रिंग लौटा
tomekceszke

@sputnick यह तुरंत खोल देता है और एक घटना की प्रतीक्षा नहीं करता है
tomekceszke

1
हेक्सडंप में कोई नई लाइनें नहीं हैं, इसलिए grepशायद एक नई लाइन के लिए अंतहीन इंतजार कर रहे हैं। catकाम करता है के बाद grepसे एक EOF मिल जाएगा अगर नहीं एक नई, कम से कम। शायद रुपये के awkसाथ की कोशिश करो {?
मूरू

जवाबों:


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

इस स्क्रिप्ट को बैलेंसिंग के साथ हर पूर्ण आउटपुट को प्रिंट करना चाहिए {और }, लेकिन आप जो चाहें उसे करने के लिए स्क्रिप्ट को बदल सकते हैं। यह स्क्रिप्ट बहुत अधिक की तुलना में एक बेंचमार्क पर अच्छा नहीं करेगी, लेकिन यह बहुत आसान है और मेरे लिए काम करने लगता है ...

ध्यान दें कि आपके परीक्षण नमूने में मिलान नहीं था {और }इसलिए, यदि यह वास्तविक इनपुट का मामला है, तो आप लाइन को प्रिंट करने के लिए मापदंड बदलना चाह सकते हैं।


ऐसा लगता है कि बेमेल ब्रेसिज़ सिर्फ इसलिए है क्योंकि उसने केवल आउटपुट की शुरुआत पोस्ट की थी।
बरमार

8

उत्तर यहाँ है: nc आउटपुट में grep मेल नहीं खा रहा है

netcat आउटपुट वर्बोज़ को मानक त्रुटि में बदलता है, इसलिए हमें grep पर जाने से पहले त्रुटियों को पकड़ने की आवश्यकता होती है।

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

इस जवाब ने सिर्फ मेरा समाधान किया। यह बहुत अजीब था जब मैं बिना उस कमांड को चलाता हूं 2>&1, ऐसा लगता है कि grep बिल्कुल काम नहीं करता है।
मारेकी

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"}
टोमेकेज़ेके

मैंने पहले वर्कअराउंड की जाँच की और यह काम करता है ! लेकिन जैसा कि आपने बताया कि यह आउटपुट को विभाजित कर सकता है इसलिए यह अंतिम समाधान नहीं हो सकता है। वैसे भी बहुत धन्यवाद!
टॉमकिज़्ज़के

1

--line-bufferedआउटपुट पर लाइन बफ़रिंग का उपयोग करने के लिए जोड़ें :

netcat localhost 9090 | grep --line-buffered sender 

मैंने पहले ही यह कोशिश की, यह काम नहीं किया।
टॉमकिज़्ज़के

1

watchकमांड का उपयोग करें :

watch 'netcat localhost 9090 | grep sender'

यह भी काम नहीं करता है। सेड के साथ भी ऐसा ही ... लेकिन, उदाहरण के लिए, यह: netcat लोकलहोस्ट 9090 | हेक्सडंप काम करता है और टेक्स्ट को हेक्स लाइव करने के लिए प्रतिस्थापित करता है, क्यों?
टॉमकिज़्ज़के


0

बैश में आप टीसीपी कनेक्शन खोलने के लिए छद्म-उपकरण फ़ाइलों का उपयोग कर सकते हैं और इसे हमेशा की तरह चला सकते हैं। उदाहरण के लिए:

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

इसका परीक्षण करने के लिए, बस सर्वर चलाएं जो कुछ फ़ाइल भेज सकता है, जैसे:

$ nc -vl 1234 < /etc/hosts

फिर दूसरे टर्मिनल grepमें आउटपुट पर परीक्षण चलाएं :

$ grep "127" < /dev/tcp/localhost/1234
127.0.0.1   localhost
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.