ट्रैक
/
AWK
AWK
/
अभ्यास
/
मूल बातें
मूल बातें

मूल बातें

सीखने का अभ्यास

परिचय

मूल बातें

हम भाषा को AWK कहेंगे और AWK प्रोग्राम पढ़कर चलाने वाले एक्ज़ीक्यूटेबल को awk या gawk।

पैटर्न और एक्शन

एक AWK प्रोग्राम पैटर्न-एक्शन जोड़ों से बनता है

pattern1 { action1 }
pattern2 { action2 }
...

एक पैटर्न ऐसा रेगुलर एक्सप्रेशन हो सकता है जिससे इनपुट का मिलान किया जाता है। यह कोई भी एक्सप्रेशन हो सकता है जिसका परिणाम सही या गलत हो।

एक एक्शन एक या अधिक AWK कमांड होते हैं। इन्हें घेरने वाले घुंघराले ब्रैकेट ज़रूरी हैं।

अगर पैटर्न का परिणाम सही हो, तो उससे जुड़े एक्शन का मूल्यांकन किया जाता है।

रिकॉर्ड और फील्ड

AWK इनपुट को रिकॉर्ड की एक श्रृंखला के रूप में पढ़ता है। हर रिकॉर्ड को शून्य या अधिक फील्ड में बाँटा जाता है।

डिफ़ॉल्ट व्यवहार यह है:

  • इनपुट को रिकॉर्ड में बाँटने के लिए "रिकॉर्ड सेपरेटर" के तौर पर न्यूलाइन इस्तेमाल करना, यानी हर लाइन एक रिकॉर्ड होती है।
  • रिकॉर्ड को फील्ड में बाँटने के लिए "फील्ड सेपरेटर" के तौर पर व्हाइटस्पेस इस्तेमाल करना, यानी हर शब्द एक फील्ड होता है।

पैटर्न और एक्शन, आगे

पैटर्न छोड़ा जा सकता है; ऐसी स्थिति में एक्शन का मूल्यांकन हर इनपुट रिकॉर्ड के लिए किया जाता है।

एक्शन छोड़ा जा सकता है; ऐसी स्थिति में डिफ़ॉल्ट एक्शन यह है कि मौजूदा रिकॉर्ड प्रिंट कर दिया जाए।

खास पैटर्न

दो खास पैटर्न हैं जिनका इस्तेमाल अक्सर किया जाता है।

  • BEGIN किसी भी इनपुट के पढ़े जाने से पहले उससे जुड़े एक्शन का मूल्यांकन करता है।
  • END सारा इनपुट पढ़े जाने के बाद उससे जुड़े एक्शन का मूल्यांकन करता है।

फील्ड वेरिएबल

फील्ड को आप $1, $2, $3 आदि से दर्शाते हैं।

मौजूदा रिकॉर्ड $0 है।

यहाँ कुछ और बिल्ट-इन वेरिएबल हैं जिनका इस्तेमाल अक्सर होता है।

इनपुट पढ़ने को नियंत्रित करने वाले बिल्ट-इन वेरिएबल
  • RS इनपुट का रिकॉर्ड सेपरेटर है। जैसा कि बताया गया, इसकी डिफ़ॉल्ट वैल्यू न्यूलाइन होती है।
  • FS इनपुट का फील्ड सेपरेटर है।

ये वेरिएबल अक्सर BEGIN एक्शन ब्लॉक में सेट किए जाते हैं।

जानकारी देने वाले बिल्ट-इन वेरिएबल

ये वेरिएबल प्रोग्राम के चलने के दौरान AWK अपने आप सेट कर लेता है।

  • NF मौजूदा रिकॉर्ड में फील्ड की संख्या रखता है।
    • अंतिम फील्ड की वैल्यू पाने के लिए $NF इस्तेमाल कीजिए।
  • NR मौजूदा रिकॉर्ड का क्रमांक रखता है।
    • जब एक से अधिक इनपुट फाइलें प्रोसेस की जा रही हों, तब NR में अब तक प्रोसेस हुए कुल रिकॉर्ड की संख्या रहती है।
  • FNR मौजूदा इनपुट फाइल के मौजूदा रिकॉर्ड का क्रमांक रखता है।
    • NR और FNR के बीच का अंतर समझाने के लिए यहाँ एक आम AWK मुहावरा दिया गया है।
      NR == FNR {action}
      
      इसका मतलब है, "अगर अब तक के रिकॉर्डों की कुल संख्या मौजूदा फाइल के रिकॉर्ड क्रमांक के बराबर हो।" यह सिर्फ पहली इनपुट फाइल के रिकॉर्डों के लिए ही सही हो सकता है।

सत्यता

AWK में सही और गलत की वही अवधारणा इस्तेमाल होती है जो C में होती है।

  • संख्या 0 गलत होती है।
  • बाकी हर संख्या सही होती है।

चूँकि AWK टेक्स्ट प्रोसेस करने वाली भाषा है, इसलिए सही और गलत की वैल्यू स्ट्रिंग पर भी लागू होती हैं।

  • खाली स्ट्रिंग "" गलत होती है।
  • कोई भी गैर-खाली स्ट्रिंग सही होती है।

कमेंट

कमेंट # अक्षर से शुरू होते हैं और लाइन के अंत तक चलते हैं।

उदाहरण

Unix जैसे सिस्टम पर /etc/passwd में उपयोगकर्ताओं की जानकारी होती है। हर उपयोगकर्ता एक अलग लाइन पर लिखा होता है, और उसके फील्ड कोलन से अलग किए गए होते हैं।

उपयोगकर्ता नामों की सूची बनाने के लिए:

awk '
    BEGIN { FS = ":" }
    { print $1 }
' /etc/passwd

ध्यान दीजिए कि {print $1} एक्शन के साथ कोई पैटर्न नहीं है, इसलिए यह हर रिकॉर्ड के लिए चलाया जाता है।

अगर हम आउटपुट को सिर्फ उन उपयोगकर्ताओं तक सीमित करना चाहें जो bash को अपने लॉगिन शेल के रूप में इस्तेमाल करते हैं, तो हम ऐसा कर सकते हैं:

awk '
    BEGIN { FS = ":" }
    $7 == "/bin/bash" { print $1 }
' /etc/passwd

निर्देश

बहुत पहले की बात है, साइबरस्पेस नाम का एक चहल-पहल से भरा शहर था। साइबरस्पेस एक डिजिटल महानगर था, जहाँ लाखों निवासी हर दिन लॉग इन और लॉग आउट करते थे। इन सभी उपयोगकर्ताओं का हिसाब रखने के लिए साइबरस्पेस में /etc/passwd नाम की एक खास फाइल थी।

/etc/passwd फाइल उस शहर की एक फोनबुक जैसी थी। उसमें हर ऐसा उपयोगकर्ता दर्ज था जिसका सिस्टम पर खाता था, साथ ही हर उपयोगकर्ता की कुछ ज़रूरी जानकारी भी थी:

संख्या फील्ड
1 उपयोगकर्ता नाम
2 पासवर्ड ("x" का मतलब है कि वास्तविक पासवर्ड सुरक्षा के लिए कहीं और संग्रहीत है)
3 UID, हर उपयोगकर्ता की एक अलग संख्यात्मक आईडी
4 GID, समूह की एक अलग संख्यात्मक आईडी (आमतौर पर UID जैसी ही)
5 उपयोगकर्ता की जानकारी (आमतौर पर उपयोगकर्ता का पूरा नाम, पर इसमें और जानकारी भी हो सकती है)
6 होम डायरेक्टरी
7 लॉगिन शेल

ये फील्ड कोलन अक्षर से अलग किए जाते हैं। एक आम प्रविष्टि ऐसी दिखती है:

glennj:x:1010:1010:Glenn Jackman:/home/glennj:/usr/local/bin/fish

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

एक दिन टीम में शामिल होने के लिए एलेक्स नाम का एक नया सिस्टम एडमिनिस्ट्रेटर भर्ती हुआ। एलेक्स को यह नया काम बहुत पसंद आया और उसने जल्दी ही /etc/passwd फाइल की पूरी जानकारी सीख ली। उसने सीखा कि सिस्टम में नए उपयोगकर्ता कैसे जोड़े जाते हैं, उपयोगकर्ता की जानकारी कैसे अपडेट की जाती है और पुराने उपयोगकर्ता कैसे हटाए जाते हैं।

/etc/passwd फाइल पर काम करते हुए एलेक्स की नज़र कुछ अजीब चीज़ पर पड़ी। कुछ उपयोगकर्ताओं की होम डायरेक्टरी अजीब या असामान्य थी। कुछ उपयोगकर्ताओं की होम डायरेक्टरी /dev/null पर सेट थी, तो कुछ की ऐसे अजीब रास्तों पर, जो मौजूद ही नहीं थे।

एलेक्स को समझ आ गया कि ये उपयोगकर्ता वास्तविक लोग नहीं, बल्कि हैकरों द्वारा बनाए गए नकली खाते हैं। हैकरों ने सिस्टम की एक कमज़ोरी का फायदा उठाने का रास्ता ढूँढ निकाला था और साइबरस्पेस तक पहुँच बनाने के लिए ये नकली खाते बनाए थे।

एलेक्स को समझ आ गया कि अब कुछ करना ज़रूरी है। उसने awk की मदद से /etc/passwd फाइल का विश्लेषण किया और सारे नकली खातों की पहचान करने के लिए एक स्क्रिप्ट लिखी। फिर उसने टीम के बाकी सदस्यों के साथ मिलकर ये खाते हटाए और उस कमज़ोरी को दुरुस्त किया जिसकी वजह से हैकर शुरू में ये खाते बना पाए थे।

एलेक्स द्वारा awk के इस्तेमाल की बदौलत टीम नकली खातों की पहचान करके उन्हें हटाने में सफल रही और साइबरस्पेस को सबके लिए और ज़्यादा सुरक्षित जगह बना सकी। सिस्टम एडमिनिस्ट्रेटर /etc/passwd फाइल को संभालते रहे, उसे अपडेट और सुरक्षित रखते हुए, और यह सुनिश्चित करते हुए कि सिस्टम का इस्तेमाल सिर्फ अधिकृत उपयोगकर्ता ही कर सकें।

अब आपकी बारी है, एलेक्स जैसे सिस्टम एडमिनिस्ट्रेटर बनने की।

Note

इस अभ्यास को हल करने के लिए AWK का कुछ और सिंटैक्स यहाँ दिया गया है।

  • बूलियन ऑपरेटर दूसरी भाषाओं जैसे ही होते हैं:

    ऑपरेशन उदाहरण
    AND expr1 && expr2
    OR expr1 || expr2
    NOT ! expr
  • फंक्शन कॉल करने का सिंटैक्स भी जाना-पहचाना है:

    function greet(name) {
        print "Hello", name
    }
    BEGIN {
        greet("Mary")   # prints "Hello Mary"
    }
    

1. उपयोगकर्ता नामों की सूची बनाइए

passwd फाइल की हर लाइन के कोलन से अलग किए गए पहले फील्ड को दिखाने वाला एक awk प्रोग्राम लिखिए।

2. लाइन संख्या दिखाइए

एक awk कमांड लिखिए जो इनपुट फाइल के हर रिकॉर्ड की लाइन संख्या दिखाए। सिर्फ लाइन संख्या दिखाइए, कोई और जानकारी नहीं।

3. अमान्य होम डायरेक्टरी वाले रिकॉर्ड दिखाइए।

साइबरस्पेस में "मान्य" होम डायरेक्टरी /home या /root से शुरू होती है। इनपुट फाइल के उन रिकॉर्ड को दिखाइए जिनकी होम डायरेक्टरी अमान्य है।

4. bash इस्तेमाल करने वाले मान्य उपयोगकर्ता दिखाइए

उन रिकॉर्ड को दिखाइए जिनमें होम डायरेक्टरी मान्य है और लॉगिन शेल bash है।


स्रोत

ChatGPT से बातचीत
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
AWK Exercism

मूल बातें शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और AWK को 3 कॉन्सेप्ट92 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।