নেটকাট আউটপুট গ্রেপ কিভাবে


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তবে ডাব্লু / ও সাফল্য।

আমি কী ভুল করছি?

সম্পাদনা:

আমি একই বিষয়টি লক্ষ্য করেছি 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( এখান থেকে নেওয়া )
ব্যবহারকারীর 43791

এটি কি এভাবে কাজ করে? netcat -z localhost 9090 | grep sender
গিলস কুইনট

@ ব্যবহারকারী 43791 আউটপুটটি এখনও খালি আছে, তবে আমি নিশ্চিত যে
নেটকাট ম্যাচের

@ স্পটনিক এটি তত্ক্ষণাত শেলের দিকে ফিরে আসে এবং কোনও ইভেন্টের জন্য অপেক্ষা করে না
টেমেকেসস্কে

1
হেক্সডাম্পে কোনও নতুন লাইন নেই, তাই grepসম্ভবত কোনও নতুন লাইনের জন্য অবিরাম অপেক্ষা করা হচ্ছে। অন্ততপক্ষে কোনও নিউলাইন না হলে একটি ইওএফ পাবে catতাই কাজ করে grep। আরএস হিসাবে চেষ্টা 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

উত্তর এখানে রয়েছে: এনসি আউটপুটে গ্রেপ মেলে না

নেটক্যাট স্ট্যান্ডার্ড ত্রুটিতে ভার্বোস লগগুলি আউটপুট করে, তাই গ্রেপ করার আগে পাইপ দেওয়ার আগে আমাদের ত্রুটিগুলি ক্যাপচার করতে হবে।

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

এই উত্তরটি আমাকে কেবল সমাধান করে তুলেছে। এটি খুব আশ্চর্যজনক ছিল যখন আমি এই আদেশটি ছাড়াই চালিত করি 2>&1, দেখে মনে হয় যে গ্রেপ মোটেও কাজ করে না।
মেরেকি

2

আমি মনে করি সমস্যাটি netcatআউটপুটে নতুন লাইনের অনুপস্থিতি । আমি দুটি কার্যকারিতা দেখতে পাচ্ছি:

  1. প্রতি xসেকেন্ডে একটি নতুন লাইন sertোকান (যদি নিউলাইনটি মাঝখানে newোকানো হয় তবে দুর্ভাগ্যজনক পরিণতি সহ source):

    ( while sleep 1; do echo; done & netcat ... ) | grep source
    
  2. awkনিউলাইন ছাড়া অন্য কোনও আরএসের সাথে ব্যবহার করুন :

    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'

এটি খুব বেশি কাজ করে না। সেডের সাথে একই ... তবে, উদাহরণস্বরূপ, এটি: নেটক্যাট লোকালহোস্ট 9090 | হেক্সডাম্প কাজ করে এবং পাঠ্যকে হেক্স লাইভ প্রতিস্থাপন করে, কেন?
tomekceszke


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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.