क्या इसके बजाय awk का इस्तेमाल किया जा सकता है?


17

मैं इससे ratingआउटपुट के रूप में संख्या प्राप्त करना चाहूंगा

# nc localhost 9571 
language:
language:en_ZA.UTF-8
language:en_ZW.UTF-8
session-with-name:Ubuntu Classic (No effects):gnome-session --session=2d-gnome
session-with-name:Ubuntu (Safe Mode):gnome-session -f --session=2d-gnome
session-with-name:Ubuntu Classic:gnome-session --session=classic-gnome
xsession:/etc/X11/Xsession
rating:94

मैं इसे इस तरह से कर सकता हूं

# nc localhost 9571 | grep rating | cut -d: -f2
94

लेकिन awkइसके बजाय एक सरल समाधान के लिए इस्तेमाल किया जा सकता है?


यह प्रश्न ऑफ़-टॉपिक प्रतीत होता है क्योंकि यह Awk इंटरफ़ेस में प्रोग्रामिंग के बारे में है और StackOverflow.com पर अधिक प्रासंगिक है
मैगेलन

जवाबों:


32
$ nc localhost 9571 | awk -F: '/rating/ { print $2 }'

7
यदि फ़ील्ड मान या नामों में से किसी में स्ट्रिंग "रेटिंग" है, तो गलत परिणाम दे सकते हैं, अर्थात सत्र नामों में से एक में शब्द "रेटिंग" है। बेहतर:awk -F: '$1 == "rating" {print $2}'
Ingmar Hupp

3
या हो सकता है awk -F: '/^rating:/ { print $2 }'?
एक CVn

मुझे पता है कि, लेकिन मैं ओपी के आदेश के आधार पर परिवर्तित करता हूं।
क्वांटा

@IngmarHupp मैंने बिल्कुल यही सोचा था। यह वास्तव में सवाल में सटीक रिकॉर्ड पर मेल खाने के लिए इतना बेहतर है कि मैंने इस बदलाव के साथ उत्तर को संपादित किया है। यह उम्मीद है कि लोगों को जाग को अधिक प्रभावी ढंग से उपयोग करने के लिए सीखने में मदद करेगा।
डेन मोल्डिंग

14

क्वांटा ने मुझे हरा दिया, लेकिन sedअगर आप इस तरह से झुके हैं तो मैं एक संस्करण शामिल करूंगा :

nc localhost 9571 | sed -ne 's/^rating://p'

हालांकि मदहैटर ने क्या कहा था। आपका वर्तमान समाधान पूरी तरह से ध्वनि है। (हालांकि मैं "^rating:"आपको केवल यह सुनिश्चित करने के लिए शब्द के बजाय grep करूंगा कि आपको केवल वह पंक्ति मिलनी चाहिए जो आप चाहते हैं।)


मैं प्यार करता हूँ sed! यह इतना कम और कम आंका गया है ...
मेई

9

आप केवल शेल का उपयोग कर सकते हैं:

nc localhost 9571 | 
while IFS=: read key val; do [[ $key = "rating" ]] && echo "$val"; done

यह सबसे तेज़ तरीका है - और इससे आगे किसी भी प्रक्रिया को पैदा करने से रोकता है nc। अच्छा!
मेई

7

हाँ, आप (और) (दो) grep और कटौती के बजाय (एक) awk का उपयोग कर सकते हैं:

$ nc localhost 9571 | awk -F: '/^rating:/ { print $2 }'

बदसूरत बग से बचने के लिए जितना हो सके आप लाइन का मिलान करें।

  • /rating/ काम करता है,
  • /^rating/ बेहतर है (सुरक्षित),
  • /^rating:/ सबसे अच्छा है (इस मामले में)।

4

यह:

nc localhost 9571  | awk -F: '{ if ($1 == "rating") print $2 }' 

(मुझे नहीं पता कि आप ऊपर दिए गए लोकलहोस्ट के साथ क्या कर रहे हैं, इसलिए अपने आउटपुट का उपयोग मेरी awk कमांड के इनपुट के रूप में करें, फिर "cat" को "nc ..." से बदल दें - लेकिन यह ठीक होना चाहिए।)

लेकिन आप ऐसा क्यों करेंगे? यूनिक्स का तरीका बहुत सारे छोटे उपकरण हैं, जिनमें से प्रत्येक एक चीज को अच्छी तरह से करता है, पाइपलाइनों के माध्यम से एक साथ घूमता है, बजाय बड़े मल्टीफ़ंक्शन उपकरणों का उपयोग करने के। आपको एक एकल मिलान लाइन का चयन करने की आवश्यकता है, उसमें से एक फ़ील्ड का चयन करें: grepमैचों के साथ लाइनों का चयन करता है, और cutइनपुट लाइनों से फ़ील्ड्स का चयन करता है; वे कार्य के लिए एकदम सही हैं। लेकिन अगर आप वास्तव में इसे ऑल-इन-वन के साथ करना चाहते हैं, तो आप वहां जाते हैं।


एक कारण यह है कि दो प्रक्रियाओं का उपयोग करने grepऔर cutस्पॉनिंग की आवश्यकता होती है, और उपयोग awk(या sed) केवल एक की आवश्यकता होती है। एक प्रक्रिया पैदा करना कम्प्यूटेशनल रूप से महंगा है। इसके अलावा, का उपयोग कर के विपरीत perlया ruby(एट अल), sedऔर awkभी बहुत कुछ हल्के सामने हैं।
मेई

2
उचित रूप से पर्याप्त है, हालांकि मैं ध्यान देता हूं कि मेरे (F15) सिस्टम पर अजीब बाइनरी का आकार 360948 बाइट्स है, जबकि ग्रीप और कट बायनेरिज़ 170824 हैं। इसलिए केवल एक कांटा + निष्पादन के साथ कम चक्र, लेकिन अधिक मेमोरी, और अधिक आईओ द्विआधारी बंद डिस्क पाने के लिए। ईमानदारी से, मुझे संदेह है कि इनमें से कोई भी विचार आधुनिक प्रणालियों पर मायने रखता है, लेकिन अगर आपको कम से कम करने का मन है, तो आप जाएं!
मध्याह्न

फू बाह: आपके संपादन प्रस्ताव के लिए धन्यवाद, लेकिन क्वांटा ने बाद में मेरी तुलना में एक पद बनाया जो आपके सुझाव से भी अधिक सुव्यवस्थित है। मैंने खान को प्राथमिकता दी क्योंकि प्रवेश-स्तर के जागृत उपयोगकर्ता के लिए यह देखना आसान है कि यह कैसे काम करता है, और इसलिए आपके संपादन को अस्वीकार कर दिया। विचार के लिए धन्यवाद, हालांकि!
मध्याह्न

3

जबकि क्वांटा का उत्तर सबसे आसान है और जो मैं भी लिखूंगा, मैं शर्त लगाता हूं कि आपको पता नहीं है कि GNU awk (gawk) नेटवर्किंग भी कर सकता है ? यदि आप वास्तव में चाहते हैं तो आप पूरी बात जागृत से लिख सकते हैं:

BEGIN {
    FS = ":"
    f = "/inet/tcp/0/127.0.0.1/9571"
    while ((f |& getline) > 0)
        if ($1 ~ /^rating$/) {print $2}
}

यह उपयोगी हो सकता है यदि सर्वर में एनसी स्थापित नहीं है, तो एनसी में प्रतिबंधित परमिट हैं, या यदि आप वास्तव में जागते हैं।


ओह। अच्छा लगा। नेटवर्किंग और एक कॉपीराइट उदाहरण।
डॉ। एडवर्ड मॉर्बियस

0

आप sed का उपयोग भी कर सकते हैं,

nc localhost 9571 | sed -n "s/^rating:\([\d]*\)/\1/p"

इससे यह सुनिश्चित हो जाएगा कि "रेटिंग" लाइन शुरू होती है, और वह अंक अनुसरण करता है rating:


0

यदि पर्ल एक विकल्प है:

nc localhost 9571 | perl -F: -lane 'print $F[1] if /rating/'

-aautosplits में प्रत्येक पंक्ति @Fसरणी
-F:का उपयोग करता है :क्षेत्र विभाजक के रूप में, के बजाय खाली स्थान के के डिफ़ॉल्ट
/rating/रिटर्न सच अगर regex पाया जाता है
$F[1]के 2 तत्व है @Fसरणी।
पर्ल arrays तत्व 0 से शुरू होता है, जबकि awk $ 1 से शुरू होता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.