এর পরিবর্তে কি 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একটি সহজ সমাধান জন্য পরিবর্তে ব্যবহার করা যেতে পারে?


এই প্রশ্নটি অফ-টপিক হিসাবে উপস্থিত বলে মনে হচ্ছে কারণ এটি অ্যাওক ইন্টারফেসে প্রোগ্রামিং সম্পর্কে এবং স্ট্যাকওভারফ্লো ডটকম
ম্যাগেলান

উত্তর:


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

7
কোনও ফিল্ডের মান বা নামের যদি স্ট্রিং "রেটিং" থাকে তবে ভুল ফলাফল দিতে পারে, অর্থাত সেশন নামের একটিতে এর মধ্যে "রেটিং" শব্দটি রয়েছে। আরও ভাল:awk -F: '$1 == "rating" {print $2}'
ইংগার হুপ

3
নাকি awk -F: '/^rating:/ { print $2 }'?
একটি সিভিএন

আমি এটি জানি, তবে আমি ওপি-র আদেশের ভিত্তিতে রূপান্তর করি।
কোয়ান্টা

@ ইঙ্গমারহুপ আমি ঠিক একই জিনিসটি ভেবেছিলাম। প্রকৃতপক্ষে সঠিক রেকর্ডের সাথে মিলে যাওয়া আরও ভাল যে আমি এই পরিবর্তনটির সাথে উত্তরটি সম্পাদনা করেছি। এটি আশা করি লোকেদের আরও কার্যকরভাবে ব্যবহার করতে শিখবে।
ড্যান মোল্ডিং

14

কোয়ান্টা আমাকে এতে মারধর করেছে, তবে sedআপনি যদি এমনভাবে ঝুঁকে থাকেন তবে আমি একটি রূপ অন্তর্ভুক্ত করব :

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

যদিও ম্যাডহ্যাটার বলেছিলেন তাও। আপনার বর্তমান সমাধান নিখুঁতভাবে দুর্দান্ত। (যদিও "^rating:"আপনি কেবল আপনার পছন্দসই লাইনটি পেয়েছেন তা নিশ্চিত করার জন্য আমি কেবল শব্দটি না দিয়ে গ্রেপ করতাম ))


আমি ভালবাসি sed! এটি এতটা নিম্নচিকিত্সা এবং অপ্রস্তুত হয় ...
মেই

9

আপনি কেবল শেলটি ব্যবহার করতে পারেন:

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

এটি দ্রুততম উপায় - এবং এর বাইরে যে কোনও প্রক্রিয়া তৈরি করতে বাধা দেয় nc। নিস!
মেই

7

হ্যাঁ, আপনি (দুটি) গ্রেপ এবং কাটের পরিবর্তে (এক) জঞ্জাল ব্যবহার করতে পারেন (এবং উচিত):

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

কুৎসিত বাগগুলি এড়াতে যতটা সম্ভব আপনার লাইনের সাথে মিলিয়ে দেওয়ার বিষয়টি নিশ্চিত হন।

  • /rating/ কাজ,
  • /^rating/ ভাল (নিরাপদ),
  • /^rating:/ সেরা (এই ক্ষেত্রে)।

4

এটা হতে পারে:

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

(উপরের লোকালহোস্টের সাথে আপনি কী করছেন তা আমি জানি না, তাই আপনার আউটপুটটি আমার awk কমান্ডের ইনপুট হিসাবে ব্যবহার করেছে, তারপরে "বিড়াল "টিকে" এনসি ... "দিয়ে প্রতিস্থাপন করা হয়েছে - তবে এটি ঠিক হওয়া উচিত))

তবে কেন আপনি এই কাজ করবেন? ইউনিক্সের পদ্ধতিতে অনেকগুলি ছোট ছোট সরঞ্জাম রয়েছে, যার প্রতিটি একটি ভাল কাজ করে, পাইপলাইনের মাধ্যমে একসাথে স্ট্রিং করে বৃহত্তর মাল্টি ফাংশন সরঞ্জামগুলি ব্যবহার না করে। আপনাকে একটি একক ম্যাচিং লাইন নির্বাচন করতে হবে, সেখান থেকে একটি ক্ষেত্র নির্বাচন করুন: grepম্যাচের সাথে লাইনগুলি cutনির্বাচন করে এবং ইনপুট লাইনগুলি থেকে ক্ষেত্রগুলি নির্বাচন করুন; তারা কাজের জন্য নিখুঁত। তবে আপনি যদি সত্যিই একে একে একে একে করতে চান তবে ভাল, আপনি সেখানে যান।


একটা কারণ হল, ব্যবহার করছে grepএবং cutদুই প্রক্রিয়ার ডিম ছাড়ার প্রয়োজন আছে এবং ব্যবহার awk(বা sed) শুধুমাত্র এক প্রয়োজন। একটি প্রক্রিয়া তৈরি করা গণনা ব্যয়বহুল। এছাড়াও, ব্যবহার অসদৃশ perlবা ruby(এট), sedএবং awkআরো অনেক কিছু লাইটওয়েট সামনে আছে।
মেই

2
যথেষ্ট উপযুক্ত, যদিও আমি লক্ষ করেছি যে আমার (F15) সিস্টেমে অ্যাজক বাইনারিটির আকার 360948 বাইট, যখন গ্রাপ এবং কাটা বাইনারি একসাথে 170824 হয়। সুতরাং কেবল একটি কাঁটা + এক্সের সাথে কম চক্র, তবে আরও মেমরি এবং আরও আইও বাইনারি বন্ধ ডিস্ক পেতে। সত্যিই, আমি সন্দেহ করি যে আধুনিক বিবেচনাধীনগুলির মধ্যে এই বিবেচনাগুলির কোনওটিই গুরুত্বপূর্ণ, তবে আপনি যদি হ্রাস করতে চান তবে আপনি সেখানে যান!
ম্যাডহ্যাটার

ফু বাহ: আপনার সম্পাদনা প্রস্তাবের জন্য ধন্যবাদ, তবে কোয়ান্টা আমার চেয়ে একটি পরে পোস্ট তৈরি করেছে যা আপনার পরামর্শের চেয়ে আরও সুচারিত। আমি আমার পছন্দ করলাম কারণ এন্ট্রি-লেভেল অ্যাডক ব্যবহারকারীর পক্ষে এটি কীভাবে কাজ করে তা সহজেই দেখা যায় এবং আপনার সম্পাদনা প্রত্যাখ্যান করে। যদিও চিন্তার জন্য আপনাকে ধন্যবাদ!
ম্যাডহ্যাটার

3

কোয়ান্টার উত্তরটি সবচেয়ে সহজ এবং আমিও এটি লিখতে পারি, তবে আমি বাজি ধরেছিলাম যে আপনি জানেন না যে জিএনইউ অ্যাওক (গাওক) নেটওয়ার্কিংও করতে পারে ? আপনি যদি সত্যিই চান তবে আপনি পুরো জিনিসটি awk দিয়ে লিখতে পারেন:

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

কোনও সার্ভারে এনসি ইনস্টল না থাকলে, এনসি পার্সেস সীমাবদ্ধ করেছে বা আপনি যদি সত্যি সত্যি অ্যাজকে চান তবে এটি কার্যকর হতে পারে।


Oooh। খুশী হলাম। নেটওয়ার্কিং এবং একটি কপ্রোসেসিং উদাহরণ।
ডাঃ এডওয়ার্ড মরবিয়াস

0

আপনি সেড ব্যবহার করতে পারেন,

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]এর 2nd উপাদান @Fঅ্যারের।
পার্ল অ্যারে 0 0 এলিমেন্ট দিয়ে শুরু হয়, যেখানে বিশ্রী $ 1 দিয়ে শুরু হয়

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