Awk के साथ गणना मिलान पैटर्न की गणना करें


13

तो मुझे ऐसा करने के लिए कहा गया था, last > lastloggedinजो एक फाइल बनाता है जो अंतिम सिस्टम रिबूट के बाद से कक्षाओं को अंतिम लॉगिन दिखाता है, और अब मुझे एक Aw स्क्रिप्ट लिखने के लिए कहा जाता है, जिसका नाम myawkउस गिनती को निर्धारित करता है / lastloggedinजिसमें स्ट्रिंग की कितनी लाइनें हैं CFS264

मेरा होगया grep -c CFS264 lastloggedin


क्या आपको उपयोग करना है awk? यदि नहीं, तो आप उपयोग कर सकते हैं grep -c CFS264 lastloggedin | wc -l
एक्सल

2
@ एक्सल: हमेशा "1" का उत्पादन grep -c (something) (something) | wc -lकरेगा ।
जी-मैन का कहना है कि 'मोनिका'

जवाबों:


21

आरंभ करने के लिए आप awkएक फ़ाइल में लाइनों की खोज करने के लिए उपयोग कर सकते हैं जिसमें एक स्ट्रिंग होती है जैसे:

$ awk '/CFS264/ { .... }' lastloggedin

{ .... }वसीयत में बिट्स उस स्ट्रिंग के साथ लाइनों की संख्या को बढ़ाने के लिए आवश्यक कमांड होंगे। यह पुष्टि करने के लिए कि ऊपर काम कर रहा है, आप print $0उन पंक्तियों को प्रिंट करने के लिए एक का उपयोग कर सकते हैं जिनमें खोज स्ट्रिंग शामिल है।

$ awk '/CFS264/ { print $0 }' lastloggedin

मतगणना के अनुसार, यदि आप "awk counter" की खोज करते हैं, तो आप इस SO Q & A शीर्षक पर ठोकर खाएंगे: awk का उपयोग रिकॉर्ड की संख्या को गिनने के लिए । आपके द्वारा वर्णित विधि के लिए वहां दी गई विधि पर्याप्त होगी:

$ awk '/CFS264/ {count++} END{print count}' lastloggedin

उदाहरण

$ last > lastloggedin

$ awk '/slm/ {count++} END {print count}' lastloggedin 
758

$ grep slm lastloggedin  | wc -l
758

$ grep -c slm lastloggedin
758

नोट: आप यह नहीं कहते कि lastआउटपुट में CFS264 किस क्षेत्र से संबंधित है । मान लें कि यह एक उपयोगकर्ता नाम है, तो आप आगे awkकेवल उसी क्षेत्र को खोजने के लिए कमांड को प्रतिबंधित कर सकते हैं :

$ awk '$1=="CFS264" { print $0 }' lastloggedin

क्षमा करें, cfs264 एक उपयोगकर्ता नाम का हिस्सा है। आप लोगों का शुक्रिया अदा करने के लिए आपका समय निकालकर मुझे यह पता लगाने में मदद करने के लिए, मैं काफी भ्रमित और निराश हो रहा था।
TayshaunS

@TayshaunS - np, आप काफी स्वागत करते हैं, क्यू के लिए धन्यवाद और शुभकामनाएँ awk
स्लम

5

निम्न उदाहरण में lastloggedinफ़ाइल की आवश्यकता के बिना मेरे द्वारा उल्लेखित समय को गिना जाता है :

$ last | awk '$1=="yeti" { ++count } END { print count }' 
106

यदि आप lastloggedinफ़ाइल का उपयोग करने के लिए जोर देते हैं या मजबूर हैं , तो आप इसे इस तरह से कर सकते हैं:

$ last > lastloggedin
$ awk '$1=="yeti" { ++count } END { print count }' lastloggedin
106

का प्रयोग करें $1~/some_chars/सभी उपयोगकर्ता नाम दिए गए वर्ण Containig या प्राप्त करने के लिए $1~/^prefix/के साथ शुरू ही नाम से मेल करने prefix:

$ last | awk '$1~/et/ { ++count } END { print count }'
106
$ last | awk '$1~/^ye/ { ++count } END { print count }'
106


पुनश्च:

man awkअधिक संकेत के लिए स्कैन ... ;-)

awk बहुत फायदेमंद है: सीखने के बहुत कम समय के बाद आप बहुत सारा सामान कर सकते हैं ...


2

अंतिम में पिछले रिबूट से उपयोगकर्ता लॉगिन शामिल हो सकते हैं। इस प्रकार, अंतिम रिबूट के बाद से उपयोगकर्ता केवल प्रिंट करेंगे:

last | awk 'NR==1,$1=="reboot"{if ($1 ~ /cfs264/ ) { count+=1; }}END{ print count; }'

Awk कमांड का पहला भाग एक सीमा निर्दिष्ट करता है - पहली पंक्ति से शुरू होता है जब तक कि पहला कॉलम 'रिबूट' न हो।

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