कैसे एक पाइप समाज से sed करने के लिए करने के लिए bcgs xcgs?


0

मेरे पास कुछ संख्याओं को आउटपुट करने वाला एक सर्वर है, मैं उन्हें समाज के साथ पढ़ रहा हूं, फिर sed का उपयोग करके, मैं उन संख्याओं को कुछ गणित समीकरणों में बदल देता हूं, मैं उन्हें bc के साथ चलाता हूं, फिर मुझे उन्हें xargs में पाइप करने की आवश्यकता है।

socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs echo

उपरोक्त पाइप कोई आउटपुट नहीं देता है। मेरा पाइप ठीक इसी तरह है सिवाय बयान के, और यह भी कोई उत्पादन नहीं करता है।

yes | gsed -u s/.*/1+1/ | bc | xargs echo

एक पाइप जैसे कि ऊपर, हालांकि, उम्मीद के मुताबिक कंसोल को 2s का एक गुच्छा प्रिंट करता है। हालांकि दोनों पाइप एक जैसे होने चाहिए, क्योंकि सेड लाइन सब कुछ एक ही वाक्यांश में बदल जाती है, चाहे कुछ भी हो। सोसाइटी के साथ पाइप कोई आउटपुट क्यों नहीं देता है? मेरा एकमात्र अनुमान है कि सर्वर केवल एक बार एक सेकंड में नंबर भेजता है, और किसी प्रकार की बफर समस्या है, लेकिन stdbuf -o0 का उपयोग करने से कुछ भी नहीं बदलता है।

जवाबों:


1

घटकों को तोड़ना:

# From host1 - Start with 'socat'
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl -
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
foo

# From host1 - Add 'sed'
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
1+1

# From host1 - add 'bc'
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
2

# From host1 - add 'xargs echo'
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs echo
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
[ nothing ]

क्या कमी है? एक प्लेसहोल्डर। नोट: '-i' प्रतिस्थापन स्ट्रिंग्स को सक्षम करता है, और '{}' प्लेसहोल्डर है।

# From host1 - setup xargs with -i
user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs echo -i{} echo {}
# From host2 send some data via udp to host1:10552
user@host2:~# echo foo > /dev/udp/host1/10552
# Result on host1
2

हम्म। लगता है-मैं वंचित हूँ। उपयोग -I

user@host1:~# socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs echo -I{} echo {}

या '-n1' का उपयोग करके अधिकतम-आर्ग को 1 पर सेट करें।

socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs -n1

या '-L1' का उपयोग अधिकतम-रेखाएँ सेट करने के लिए 1. जैसा कि टिप्पणियों में किया गया है।

socat -u udp-recv:10552,reuseaddr,crnl - | sed -u s/.*/1+1/ | bc | xargs -L1

अधिक जटिल आदेशों पर:

http://www.tldp.org/LDP/abs/html/moreadv.html

उम्मीद है कि यह मदद करता है।


संक्षेप में: xargsअधिक इनपुट की प्रतीक्षा कर रहा है। मुझे लगता है कि xargs -L 1शायद इससे बचने के लिए पर्याप्त है।
टोबे स्पाइट

हाँ, मैं -n विकल्प जोड़ने के लिए वापस आया, लेकिन आपकी टिप्पणी अधिक मान्य हो सकती है जो पास हो जाता है, और इस उत्तर को कौन पढ़ रहा है। धन्यवाद। @ टोबेस्पाइट
एलेक्स एटकिन्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.