यह गाइड आपको Linux में awk कमांड का उपयोग करना दिखाता है, बहुत सारे उपयोगी रोजमर्रा के उदाहरणों के साथ।
AWK Linux ऑपरेटिंग सिस्टम के लिए टेक्स्ट खोजने और हेरफेर करने के लिए एक टूल और भाषा है।
awk कमांड और संबंधित स्क्रिप्टिंग भाषा एक पैटर्न द्वारा परिभाषित टेक्स्ट के लिए फ़ाइलों को खोजती है और पैटर्न से मेल खाने वाले टेक्स्ट पर एक विशिष्ट एक्शन करती है।
awk बड़े टेक्स्ट फ़ाइलों या बड़ी संख्या में टेक्स्ट फ़ाइलों से डेटा निकालने और रिपोर्ट बनाने के लिए एक उपयोगी टूल है – उदाहरण के लिए लॉग प्रोसेसिंग, या तापमान प्रोब जैसे डेटा-रिकॉर्डिंग डिवाइस का आउटपुट, जिन्होंने समय के साथ बहुत सारा डेटा एकत्र किया है। इसका उपयोग डेटाबेस क्वेरी के आउटपुट पर भी किया जा सकता है।
awk; इंस्टॉल करने की कोई आवश्यकता नहीं है; यह पहले से ही आपके Linux सिस्टम पर उपलब्ध होना चाहिए।
awk सिंटैक्स
टर्मिनल में awk कमांड का उपयोग करने के लिए सिंटैक्स इस प्रकार है:
awk [PROGRAM] [INPUT FILES]
ध्यान दें कि:
- [PROGRAM] खोज पैटर्न और लेने वाली कार्रवाई है – यह वह प्रोग्राम है जिसे आप awk को आपूर्ति की गई फ़ाइलों पर चलाना चाहते हैं
- इसे -f विकल्प का उपयोग करके इंलाइन के बजाय टेक्स्ट फ़ाइल के रूप में भी आपूर्ति किया जा सकता है
- [INPUT FILES] वे फ़ाइलें हैं जिन्हें आप awk पर काम करना चाहते हैं – यह स्पेस से अलग कई फ़ाइलें हो सकती हैं, या डायरेक्टरी का पथ, या मिलान करने के लिए फ़ाइलों का पैटर्न
- यदि कोई इनपुट फ़ाइल निर्दिष्ट नहीं है, तो awk किसी अन्य कमांड से पाइप्ड आउटपुट पर काम करेगा
awk विकल्प
awk कमांड को निम्न विकल्प प्रदान किए जा सकते हैं:
| -f program-file | प्रोग्राम टेक्स्ट कमांड-लाइन के बजाय फ़ाइल से पढ़ा जाता है। एकाधिक -f विकल्प स्वीकार किए जाते हैं। |
| -F value | फील्ड सेपरेटर, FS, को value पर सेट करता है। |
| -v var=value | प्रोग्राम वेरिएबल var को value असाइन करता है। |
आपके awk संस्करण के लिए अधिक कार्यान्वयन-विशिष्ट विकल्पों के लिए, आप निम्न चलाकर मैनुअल देख सकते हैं:
man awk
प्रोग्राम एक्शन और वेरिएबल
awk को आपूर्ति किया गया प्रोग्राम यह निर्धारित करेगा कि यह आपके द्वारा आपूर्ति की गई टेक्स्ट फ़ाइलों पर क्या करता है। एक awk प्रोग्राम निम्न प्रारूप लेता है:
CONDITION { ACTION } CONDITION { ACTION } ...
जहां CONDITION मिलान करने के लिए टेक्स्ट का पैटर्न है और ACTION मिलान टेक्स्ट पर की जाने वाली कार्रवाई है। आप जितनी चाहें उतनी शर्तें और कार्रवाई कर सकते हैं।
एक्शन
आपूर्ति की गई कार्रवाइयां कमांड हैं जिनमें गणना, वेरिएबल, और फ़ंक्शन कॉल शामिल हो सकते हैं। कुछ बिल्ट-इन फ़ंक्शन कार्यान्वयन-विशिष्ट हैं, इसलिए इनके लिए अपने मैनुअल की जांच करना सबसे अच्छा है।
रिकॉर्ड
awk आमतौर पर टेक्स्ट फ़ाइल में प्रत्येक नई लाइन को रिकॉर्ड मानता है जब तक कि OPTIONS के माध्यम से अन्यथा निर्दिष्ट न किया जाए।
फ़ील्ड
awk डिफ़ॉल्ट रूप से व्हाइटस्पेस (स्पेस, टैब) का उपयोग करके रिकॉर्ड में फ़ील्ड को दर्शाता है जब तक कि OPTIONS के माध्यम से अन्यथा निर्दिष्ट न किया जाए।
वेरिएबल
awk में कई बिल्ट-इन वेरिएबल हैं जिनका उपयोग आप उन्हें स्वयं परिभाषित किए बिना कर सकते हैं, जो कुछ सामान्य परिदृश्यों को कवर करते हैं:
| वेरिएबल | अर्थ |
|---|---|
| $0 | पूरे रिकॉर्ड का प्रतिनिधित्व करता है |
| $1, $2, $3 … | फ़ील्ड वेरिएबल – रिकॉर्ड में व्यक्तिगत टेक्स्ट फ़ील्ड के लिए टेक्स्ट/मान रखते हैं |
| NR / Number of Records | अब तक सभी फ़ाइलों से पढ़े गए इनपुट रिकॉर्ड की वर्तमान संख्या |
| FNR / File Number of Records | वर्तमान फ़ाइल में अब तक पढ़े गए इनपुट रिकॉर्ड की वर्तमान संख्या – प्रत्येक नई फ़ाइल शुरू होने पर स्वचालित रूप से शून्य पर रीसेट |
| NF / Number of Fields | वर्तमान इनपुट रिकॉर्ड में फ़ील्ड की संख्या – रिकॉर्ड में अंतिम फ़ील्ड को $NF का उपयोग करके संदर्भित किया जा सकता है, दूसरा अंतिम $(NF-1) का उपयोग करके, और इसी तरह |
| FILENAME | वर्तमान इनपुट फ़ाइल का नाम |
| FS / Field Separator | रिकॉर्ड में फ़ील्ड को अलग करने के लिए उपयोग किए जाने वाले कैरेक्टर। डिफ़ॉल्ट रूप से किसी भी स्पेस और टैब कैरेक्टर शामिल हैं |
| RS / Record Separator | फ़ाइल में रिकॉर्ड को अलग करने के लिए उपयोग किए जाने वाले कैरेक्टर। डिफ़ॉल्ट रूप से नई लाइन |
| OFS / Output Field Separator | Awk आउटपुट में फ़ील्ड को अलग करने के लिए उपयोग किए जाने वाले कैरेक्टर। डिफ़ॉल्ट एक सिंगल स्पेस है |
| ORS / Output Record Separator | Awk आउटपुट में फ़ील्ड को अलग करने के लिए उपयोग किए जाने वाले कैरेक्टर। डिफ़ॉल्ट नई लाइन है |
| OFMT / Output ForMaT | संख्यात्मक आउटपुट के लिए प्रारूप – डिफ़ॉल्ट प्रारूप "%.6g" है |
awk उपयोग उदाहरण
इन उदाहरणों के लिए, हम flowers.txt नामक एक टेक्स्ट फ़ाइल पर काम करेंगे, जिसमें निम्न टेक्स्ट है:
red rose yellow daffodil pink flamingo white rose blue iris white lily red peony yellow orchid purple foxglove
फ़ाइल सामग्री प्रिंट करें
निम्न awk कमांड awk print फ़ंक्शन का उपयोग करके फ़ाइल की सामग्री को टर्मिनल पर आउटपुट करेगा:
awk '{print}' flowers.txt
फ़ाइल में रिकॉर्ड (लाइन्स) की संख्या प्रिंट करें
awk 'END { print NR }' sample.txt
यह उदाहरण फ़ाइल में लाइन्स की संख्या आउटपुट करेगा:
9
नियमित अभिव्यक्तियों का उपयोग करके फ़ाइल में टेक्स्ट खोजें
निम्न कमांड फ़ाइल में केवल rose प्रकार की पंक्तियों को आउटपुट करेगा:
awk '/rose/' flowers.txt
ध्यान दें कि खोज करने के लिए टेक्स्ट को परिभाषित करने के लिए REGEX (नियमित अभिव्यक्ति) सिंटैक्स का उपयोग किया जाता है।
यह कमांड आउटपुट करेगा:
red rose white rose
अधिक रेगेक्स
awk '/^p/' flowers.txt
यह कमांड केवल p से शुरू होने वाले रिकॉर्ड आउटपुट करेगा:
pink flamingo purple foxglove
फ़ील्ड वेरिएबल का उपयोग करना
फ़ील्ड वेरिएबल का उपयोग करके, आप केवल p से शुरू होने वाले रिकॉर्ड के लिए पहला फ़ील्ड आउटपुट कर सकते हैं:
awk '/^p/ {print $1;}' flowers.txt
जो आउटपुट करेगा:
pink purple
अन्य प्रोग्राम से आउटपुट प्रोसेस करना
आप प्रोसेसिंग के लिए अन्य Linux शेल प्रोग्राम से आउटपुट को awk में पाइप कर सकते हैं। यह उदाहरण ls -l कमांड से आउटपुट लेता है, जो वर्तमान डायरेक्टरी की सामग्री को सूचीबद्ध करता है और 5वें फ़ील्ड (फ़ाइल का आकार) की सामग्री लौटाता है:
ls -l | awk '{print $5}'
जो ऐसा कुछ आउटपुट करेगा:
3104 3072 224 256
…(वर्तमान डायरेक्टरी में कितनी फ़ाइलें हैं और वे कितनी बड़ी हैं, इस पर निर्भर करता है)।
बिल्ट-इन वेरिएबल का उपयोग करना
awk '{print NR "-" $2 }' flowers.txt
यह कमांड वर्तमान रिकॉर्ड नंबर (फ़ाइल लाइन नंबर) उसके बाद दूसरा फ़ील्ड – फूल का नाम प्रिंट करेगा:
1-red rose 2-yellow daffodil 3-pink flamingo 4-white rose 5-blue iris 6-white lily 7-red peony 8-yellow orchid 9-purple foxglove
एक्शन संयोजित करना
शर्तें और कार्रवाई को && का उपयोग करके संयोजित किया जा सकता है। यह कमांड उन सभी रिकॉर्ड को प्रिंट करेगा जहां पहला फ़ील्ड red टेक्स्ट रखता है और दूसरा फ़ील्ड 5 से कम कैरेक्टर रखता है:
awk '$1 ~ /red/ && length($NF) < 5 { print }' flowers.txt
ध्यान दें:
- $NF का उपयोग दूसरे फ़ील्ड तक पहुंचने के विकल्प के रूप में – संभव है क्योंकि यह अंतिम फ़ील्ड है और इस प्रकार NF (फ़ील्ड की संख्या) के बराबर है
- फ़ील्ड की लंबाई की गणना करने के लिए length() फ़ंक्शन का उपयोग किया जाता है
तो यह उदाहरण फ़ाइल से एक मिलान रिकॉर्ड लौटाता है:
red rose
निष्कर्ष
awk बहुत अच्छे कारण से Linux के साथ लगभग सार्वभौमिक रूप से शामिल है – यह टेक्स्ट खोजने और प्रोसेस करने के लिए एक प्रमुख टूल है, जिसका उपयोग आप अपने सिस्टम पर कुछ गलत होने पर लॉग एंट्री जल्दी खोजने के लिए या शोध उपयोग के लिए कैप्चर किए गए डेटा को प्रोसेस करने के लिए कर सकते हैं।
यदि आपने कभी टेक्स्ट फ़ाइलों के बड़े संग्रह पर सरल खोज/बदलाव से अधिक कुछ करने की कोशिश की है, तो आप जानेंगे कि अपने टेक्स्ट पर प्रोग्रामेटिक रूप से विशिष्ट प्रतिस्थापन या अपडेट करने में सक्षम होने का मूल्य, व्यक्तिगत खोज/बदलाव कमांड चलाए बिना।
हमारे अन्य Linux टिप्स देखें!