एडब्ल्यूके
यह लेख प्रोग्रामिंग भाषा के बारे में है। अन्य उपयोगों के लिए, AWK (बहुविकल्पी) देखें ।
एडब्ल्यूके (awk)[1]एक डोमेन-विशिष्ट भाषा है जिसे पाठ प्रसंस्करण के लिए डिज़ाइन किया गया है और आमतौर पर डेटा निष्कर्षण और लेखन उपकरण के रूप में उपयोग किया जाता है। sed और grep की तरह,यह एक फिल्टर (सॉफ्टवेयर) है,[1] और अधिकांश यूनिक्स जैसे प्रचालन तंत्र की एक मानक विशेषता है।
आदर्श | स्क्रिप्टिंग , प्रक्रियात्मक , डेटा-संचालित |
---|---|
द्वारा डिज़ाइन किया गया | अल्फ्रेड अहो , पीटर वेनबर्गर , और ब्रायन कर्निघन |
पहली प्रस्तुति | 1977 ; 45 साल पहले |
स्थिर निस्तार | IEEE Std 1003.1-2008 (POSIX) / 1985 |
टाइपिंग अनुशासन | कोई भी नहीं; तार, पूर्णांक और फ़्लोटिंग-पॉइंट नंबरों को संभाल सकता है; नियमित अभिव्यक्ति |
ओएस | क्रॉस-प्लेटफॉर्म |
प्रमुख कार्यान्वयन | |
awk, GNU Awk, mawk, nawk, MKS AWK, Thompson AWK (संकलक), Awka (संकलक) | |
बोलियों | |
पुराना awk oawk 1977, new awk nawk 1985, GNU awk gawk | |
से प्रभावित | |
सी , सेड , स्नोबोल | |
प्रभावित | |
टीसीएल , एएमपीएल , पर्ल , कोर्न शेल ( ksh93 , dtksh , tksh ), लुआ |
AWK भाषा एक डेटा संचालन पटकथा(स्क्रिप्टिंग) भाषा है जिसमें पाठ्य डेटा की श्रृंखलाओं के विपरीत की जाने वाली क्रियाओं का एक समूह होता है जिसमें टेक्स्ट निकालने या बदलने के उद्देश्य से या तो सीधे फाइलों पर कार्य करता है या एक पाइपलाइन के हिस्से के रूप में उपयोग किया जाता है- जैसे स्वरूपित रिपोर्ट तैयार करना। ये भाषा बड़े पैमाने पर श्रृंखलाओं डेटा प्रकार,सहयोगी सरणी,और नियमित अभिव्यक्तियों का उपयोग करती है। जबकि AWK का एक सीमित प्रयोजन कार्यक्षेत्र (सॉफ्टवेयर इंजीनियरिंग) है और इसे विशेष रूप से एक-पंक्तिय कार्यक्रमो का समर्थन करने के लिए डिज़ाइन किया गया था, भाषा ट्यूरिंग-पूर्ण है, और यहां तक कि एडब्ल्यूके के प्रारंभिक बेल लैब्स उपयोगकर्ता अक्सर अच्छी तरह से संरचित बड़े एडब्ल्यूके प्रोग्राम लिखते थे।[2]
एडब्ल्यूके को 1970 के दशक में बेल लैब्स में बनाया गया था,[3] और इसका नाम इसके लेखकों के उपनामों से लिया गया है: मैं अल्फ्रेड हूं, पीटर जे वेनबर्गर और ब्रायन कर्निघन। परिवर्णी शब्द का उच्चारण पक्षी औक (auk) के नाम के समान ही किया जाता है, जो एडब्ल्यूके प्रोग्रामिंग भाषा के कवर पर है।[4] जब सभी छोटे अक्षरों में लिखा जाता है, जैसे awk
,यह बेल लैब्स प्रोग्राम के यूनिक्स या परियोजना 9 को संदर्भित करता है जो AWK प्रोग्रामिंग भाषा में लिखी गई पटकथा को चलाता है।
इतिहास
एडब्ल्यूके को शुरू में 1977 में अल्फ्रेड अहो(A), पीटर जे. वेनबर्गर(W),और ब्रायन कर्निघन(K )द्वारा विकसित किया गया था। एडब्ल्यूके नाम इसके लेखकों के उपनाम क पहले अक्षर से लिया गया है। कर्निघन के अनुसार,एडब्ल्यूके के लक्ष्यों में से एक ऐसा उपकरण होना था जो आसानी से संख्याओं और श्रृंखलाओं दोनों में कुशलता से काम कर सके। एडब्ल्यूके मार्क रोचकिंड की प्रोग्रामिंग भाषा से भी प्रेरित था जिसका उपयोग निविष्ट(इनपुट) डेटा में प्रतिरूप खोजने के लिए किया गया था,और इसे yacc का उपयोग करके लागू किया गया था।[5]
संस्करण 7 यूनिक्स में प्रकट होने वाले शुरुआती उपकरणों में से एक के रूप में, एडब्ल्यूके ने बॉर्न शेल के अलावा एक यूनिक्स पाइपलाइन में गणितीय सुविधाएँ जोड़ीं, जो मानक यूनिक्स वातावरण में उपलब्ध एकमात्र पटकथा भाषा है। यह एकल यूनिक्स विशिष्टता की अनिवार्य उपयोगिताओं में से एक है,[6] और Linux मानक आधार विनिर्देश द्वारा आवश्यक है।[7]एडब्ल्यूके को 1985-88 में महत्वपूर्ण रूप से संशोधित और विस्तारित किया गया था, जिसके परिणामस्वरूप 1988 में जारी पॉल रूबिन जे फेनलसन और रिचर्ड स्टालमैन द्वारा लिखित Gawk(GNU पैकेज) कार्यान्वयन हुआ।[8]जीएनयू एडब्ल्यूके सबसे व्यापक रूप से तैनात संस्करण हो सकता है[9] क्योंकि यह जीएनयू-आधारित Linux पैकेज में शामिल है। 1994 से केवल अर्नोल्ड रॉबिंस ने जीएनयू एडब्ल्यूके को बनाए रखा गया है।[8] ब्रायन कर्निघन का नॉक (न्यू एडब्ल्यूके) स्रोत पहली बार 1993 में अप्रकाशित और 1990 के दशक के अंत से सार्वजनिक रूप से जारी किया गया था; कई बीएसडी व्यवस्था जीपीएल अनुज्ञा पत्र से बचने के लिए इसका इस्तेमाल करते हैं।[8]
एडब्ल्यूके सेड(1974) से पहले था। दोनों को पाठ प्रसंस्करण के लिए रचित किया गया था। वे पंक्ति-उन्मुख,डेटा-संचालित प्रतिमान साझा करते हैं,और अंतर्निहित मुख्य लूप और मौजूदा पंक्ति चर के अंतर्निहित एक-पंक्तिय प्रोग्राम लिखने के लिए विशेष रूप से उपयुक्त हैं। प्रारंभिक एडब्ल्यूके कार्यक्रमों की शक्ति और कठोरता और साथ में उस समय एडब्ल्यूके की सीमाएं- विशेष रूप से शक्तिशाली नियमित अभिव्यक्ति से निपटने और निहित चर के कारण संक्षिप्तता,जो एक-पंक्तिय सुविधा प्रदान करते हैं - पर्ल भाषा (1987) के लिए महत्वपूर्ण प्रेरणा थीं। 1990 के दशक में,पर्ल बहुत लोकप्रिय हो गया था, यूनिक्स पाठ-प्रसंस्करण भाषाओं के सन्दर्भ में एडब्ल्यूके साथ प्रतिस्पर्धा कर रहा था।
एडब्ल्यूके कार्यक्रमों की संरचना
एडब्ल्यूके निविष्ट को एक बार में एक पंक्ति में पढ़ता है। कार्यक्रम में प्रत्येक प्रतिरूप के लिए एक पंक्ति जांची जाती है,और प्रत्येक प्रतिरूप के लिए मिलान किया जाता है, और संबंधित क्रिया निष्पादित की जाती है।
- -
एडब्ल्यूके प्रोग्राम प्रतिरूप गतिविधि जोड़े की एक श्रृंखला है, जिसे इस प्रकार लिखा गया है:
स्थिति { गतिविधि }
स्थिति { गतिविधि } ..
जहां स्थिति सामान्यतौर पर एक अभिव्यक्ति है और क्रिया आदेशों की एक श्रृंखला है। निविष्ट को अभिलेख में विभाजित किया जाता है,जहां डिफ़ॉल्ट रूप से अभिलेख को नई पंक्ति वर्णों से अलग किया जाता है ताकि निविष्ट को पंक्तियों में विभाजित किया जा सके। कार्यक्रम बदले में प्रत्येक स्थिति के विरुद्ध प्रत्येक अभिलेख का परीक्षण करता है,और प्रत्येक सत्य अभिव्यक्ति के लिए क्रिया निष्पादित करता है /या तो शर्त या क्रिया को छोड़ा जा सकता है। स्तिथि सभी अभिलेख से मेल खाने के लिए बाध्य है। अभिलेख को छापना महत्वपूर्ण क्रिया है। यह सेड के समान श्रृंखला-क्रिया संरचना है।
एक साधारण एडब्ल्यूके अभिव्यक्ति के अलावा, जैसे foo == 1
या /^foo/
स्थिति हो सकती है BEGIN
या END
सभी अभिलेख पढ़ने से पहले या बाद में कार्रवाई को निष्पादित करने का कारण बनता है, या श्रृंखला 1, श्रृंखला 2 जो एक अभिलेख से शुरू होने वाले अभिलेख की श्रेणी से मेल खाता है जो श्रृंखला1 से मेल खाता है और उस अभिलेख को शामिल करता है जो श्रृंखला 2 से मेल खाता है और बाद की पंक्तियों को श्रृंखला 1 के विपरीत फिर से मिलान करने का प्रयास करता है।
सामान्य अंकगणितीय और तार्किक संचालकों के अलावा, एडब्ल्यूके अभिव्यक्ति में टिल्ड संचालक शामिल है, ~
, जो एक श्रृंखला के विपरीत एक नियमित अभिव्यक्ति से मेल खाता है। सुविधाजनक सिंटैक्टिक चीनी के रूप में, /regexp/ टिल्ड संचालक का उपयोग किए बिना मौजूदा रिकॉर्ड के विपरीत मेल खाता है; यह सिंटैक्स sed से निकला है, जो बदले में इसे एड (टेक्स्ट एडिटर) संपादक से विरासत में मिला है, जहाँ /
खोजने के लिए प्रयोग किया जाता है। नियमित अभिव्यक्ति के लिए सीमांकक के रूप में स्लैश का उपयोग करने का यह सिंटैक्स बाद में पर्ल और ईसीएमए पटकथा द्वारा अपनाया गया था,और अब जन साधारण है। पर्ल द्वारा टिल्ड संचालक को भी अपनाया गया था।
आदेश
एडब्ल्यूके कमांड वे कथन हैं जो उपरोक्त उदाहरणों में कार्रवाई के लिए प्रतिस्थापित किए गए हैं। एडब्ल्यूके आदेश में कार्य आह्वान (फंक्शन कॉल ),चर कार्यभार,गणना,या कोई संयोजन शामिल हो सकता है।एडब्ल्यूके में कई कार्यों के लिए अंतर्निहित समर्थन शामिल है;एडब्ल्यूके के विभिन्न स्वादों द्वारा और भी बहुत कुछ प्रदान किया जाता है। साथ ही, कुछ स्वाद गतिशील रूप से लिंक की गई लाइब्रेरी को शामिल करने का समर्थन करते हैं, जो अधिक फ़ंक्शन भी प्रदान कर सकता है।
प्रिंट आदेश
प्रिंट आदेश का उपयोग लिखित सामग्री को उत्पादन करने के लिए किया जाता है। उत्पादित लिखित सामग्री हमेशा एक पूर्वनिर्धारित श्रृंखला के साथ समाप्त होता है जिसे श्रृंखला अभिलेख विभाजक (ओआरएस) कहा जाता है जिसका पूर्वनिर्धारित मान एक नई पंक्ति है। इस आदेश का सबसे सरल रूप है:
print
- यह मौजूदा अभिलेख की सामग्री प्रदर्शित करता है। एडब्ल्यूके में,अभिलेख को क्षेत्रों में तोड़ा जाता है,और इन्हें अलग से प्रदर्शित किया जा सकता है:
print $1
- मौजूदा अभिलेख का पहला क्षेत्र प्रदर्शित करता है
print $1, $3
- मौजूदा अभिलेख के पहले और तीसरे क्षेत्र को प्रदर्शित करता है, जिसे एक पूर्वनिर्धारित श्रृंखला द्वारा अलग किया जाता है जिसे उत्पादन क्षेत्र विभाजक (OFS) कहा जाता है, जिसका पूर्वनिर्धारित मान एक अन्तर वर्ण है।
हालांकि ये क्षेत्र ($X) चर के समान हो सकते हैं ($ प्रतीक पर्ल में चर को इंगित करता है), वे वास्तव में मौजूदा अभिलेख के क्षेत्र को संदर्भित करते हैं। एक विशेष अवस्था मे, $0, पूरे अभिलेख को संदर्भित करता है। वास्तव में, आदेशprint
तथाprint $0
कार्यक्षमता में समान हैं।
प्रिंट आदेश गणना और/या कार्य आह्वान के परिणाम भी प्रदर्शित कर सकता है:
<वाक्यविन्यास लैंग = awk> /regex_pattern/ {
# रिकॉर्ड (पंक्ति) उपरोक्त regex_pattern से मेल खाने की स्थिति में प्रदर्शन करने के लिए कार्य 3+2 प्रिंट करें फ़ोबार प्रिंट करें(3) प्रिंट फोबार (चर) प्रिंट पाप (3-2)
} </वाक्यविन्यास हाइलाइट>
उत्पादन फ़ाइल में भेजा जा सकता है: <वाक्यविन्यास लैंग = awk> /regex_pattern/ {
# रिकॉर्ड (पंक्ति) उपरोक्त regex_pattern से मेल खाने की स्थिति में प्रदर्शन करने के लिए कार्य प्रिंट अभिव्यक्ति> फ़ाइल का नाम
} </वाक्यविन्यास हाइलाइट>
या एक पाइप के माध्यम से (यूनिक्स): <वाक्यविन्यास लैंग = awk> /regex_pattern/ {
# रिकॉर्ड (पंक्ति) उपरोक्त regex_pattern से मेल खाने की स्थिति में प्रदर्शन करने के लिए कार्य प्रिंट अभिव्यक्ति | आज्ञा
} </वाक्यविन्यास हाइलाइट>
अंतर्निहित चर
एडब्ल्यूके के अंतर्निहित चर में क्षेत्र चर शामिल हैं: $1, $2, $3, और इसी तरह ($0 पूरे अभिलेख का प्रतिनिधित्व करता है)। वे अभिलेख में अलग-अलग लिखित सामग्री क्षेत्र में लिखित सामग्री या मान रखते हैं।
अन्य चर में शामिल हैं:
NR
: अभिलेखों की संख्या। सभी डेटा फ़ाइलों से अब तक पढ़े गए निविष्ट अभिलेख की संख्या की मौजूदा गणना रखता है। यह शून्य से शुरू होता है, लेकिन कभी भी स्वचालित रूप से शून्य पर फिर से स्थापित नहीं होता है।[10]FNR
: अभिलेख की फ़ाइल संख्या। मौजूदा फ़ाइल में अब तक पढ़े गए निविष्ट अभिलेख की संख्या की तत्काल गणना रखता है। हर बार जब कोई नई फ़ाइल शुरू होती है तो यह चर स्वचालित रूप से शून्य पर फिर से स्थापित हो जाता है।[10]*NF
: क्षेत्रों की संख्या। मौजूदा निविष्ट अभिलेख में क्षेत्र की संख्या शामिल है। निविष्ट अभिलेख में अंतिम क्षेत्र को $NF, दूसरे से अंतिम क्षेत्र को $(NF-1), तीसरे से अंतिम क्षेत्र को $(NF-2), आदि द्वारा निर्दिष्ट किया जा सकता है।FILENAME
: मौजूदा निविष्ट-फ़ाइल का नाम समाहित करता है।FS
: क्षेत्र विभाजक। निविष्ट अभिलेखमें क्षेत्र को विभाजित करने के लिए उपयोग किए जाने वाले क्षेत्र विभाजक शामिल हैं। पूर्वस्थापित,सफेद स्थान और टैब वर्णों के किसी भी क्रम की अनुमति देता है। क्षेत्र विभाजक को बदलने के लिए FS को किसी अन्य वर्ण या वर्ण अनुक्रम के साथ पुन: सौंपा जा सकता है।RS
:अभिलेख विभाजक। मौजूदा अभिलेख विभाजक चरित्र को संग्रहीत करता है। चूंकि, पूर्वस्थापित रूप से,एक निविष्ट पंक्ति निविष्ट अभिलेख है, क्षेत्र अभिलेख पूर्वस्थापित वर्ण एक 'नई पंक्ति' है।OFS:
उत्पादन क्षेत्र विभाजक। उत्पादन क्षेत्र विभाजक को संग्रहीत करता है, जो क्षेत्र को तब अलग करता है जब एडब्ल्यूके उन्हें छापता है। पूर्वस्थापित एक स्थान वर्ण है।ORS
: उत्पादन अभिलेख विभाजक। उत्पादन अभिलेख विभाजक को संग्रहीत करता है, जो उत्पादन अभिलेख को तब अलग करता है जब एडब्ल्यूके उन्हें छापता है। पूर्वस्थापित वर्ण एक 'नई पंक्ति' है।OFMT
: उत्पादन स्वरूप। संख्यात्मक उत्पादन के लिए प्रारूप को संगृहीत करता है। पूर्वस्थापित प्रारूप %.6g है।
चर और वाक्य रचना
वेरिएबल नाम किसी भी अक्षर [A-Za-z0-9_] का उपयोग कर सकते हैं, भाषा कीवर्ड के अपवाद के साथ। ऑपरेटर्स + - * / क्रमशः जोड़, घटाव, गुणा और भाग का प्रतिनिधित्व करते हैं। स्ट्रिंग संघनन के लिए, बस दो चर (या स्ट्रिंग स्थिरांक) एक दूसरे के बगल में रखें। यदि स्ट्रिंग स्थिरांक शामिल हैं, तो बीच में एक स्थान का उपयोग करना वैकल्पिक है, लेकिन एक दूसरे से सटे हुए दो चर नामों के बीच में एक स्थान की आवश्यकता होती है। दोहरे उद्धरण स्ट्रिंग स्थिरांक का परिसीमन करते हैं। बयानों को अर्धविरामों के साथ समाप्त करने की आवश्यकता नहीं है। अंत में, एक पंक्ति पर पहले वर्ण के रूप में # का उपयोग करके कार्यक्रमों में टिप्पणियां जोड़ी जा सकती हैं।
उपयोगकर्ता परिभाषित कार्य
सी (प्रोग्रामिंग भाषा) के समान प्रारूप में, फ़ंक्शन परिभाषाओं में कीवर्ड शामिल होता है function
, फ़ंक्शन नाम, तर्क नाम और फ़ंक्शन बॉडी। यहाँ एक फ़ंक्शन का उदाहरण दिया गया है।
<वाक्यविन्यास लैंग = awk>
समारोह add_three (संख्या) {
वापसी संख्या + 3
} </वाक्यविन्यास हाइलाइट>
इस कथन को निम्नानुसार लागू किया जा सकता है: <वाक्यविन्यास लैंग = awk> (नमूना) {
प्रिंट ऐड_थ्री (36) # आउटपुट 39
} </वाक्यविन्यास हाइलाइट>
फ़ंक्शंस में वेरिएबल्स हो सकते हैं जो स्थानीय दायरे में हैं। इनके नाम तर्क सूची के अंत में जोड़े जाते हैं, हालांकि फ़ंक्शन को कॉल करते समय इनके लिए मान छोड़े जाने चाहिए। स्थानीय वेरिएबल्स से पहले तर्क सूची में कुछ व्हाइटस्पेस चरित्र जोड़ने के लिए यह परंपरा है, यह इंगित करने के लिए कि पैरामीटर कहां समाप्त होते हैं और स्थानीय चर शुरू होते हैं।
उदाहरण
हैलो वर्ल्ड
यहाँ प्रथागत हैलो, वर्ल्ड है! प्रोग्राम|हैलो, विश्व कार्यक्रम AWK में लिखा गया है: <वाक्यविन्यास लैंग = awk> शुरू करना {
प्रिंट हैलो, दुनिया! बाहर निकलना
} </वाक्यविन्यास हाइलाइट>
=== 80 वर्णों से अधिक लंबी लाइनें === प्रिंट करें
80 वर्णों से अधिक लंबी सभी पंक्तियों को प्रिंट करें। ध्यान दें कि डिफ़ॉल्ट क्रिया वर्तमान लाइन को प्रिंट करना है। <वाक्यविन्यास लैंग = awk> लंबाई($0) > 80 </वाक्यविन्यास हाइलाइट>
शब्द गिनें
इनपुट में शब्दों की गणना करें और पंक्तियों, शब्दों और वर्णों की संख्या प्रिंट करें (जैसे wc (यूनिक्स)): <वाक्यविन्यास लैंग = awk> {
शब्द + = एनएफ वर्ण + = लंबाई + 1 # प्रत्येक रिकॉर्ड (पंक्ति) के अंत में न्यूलाइन वर्ण के लिए खाते में एक जोड़ें
} END {प्रिंट एनआर, शब्द, वर्ण} </वाक्यविन्यास हाइलाइट>
चूंकि कार्यक्रम की पहली पंक्ति के लिए कोई पैटर्न नहीं है, इनपुट की प्रत्येक पंक्ति डिफ़ॉल्ट रूप से मेल खाती है, इसलिए प्रत्येक पंक्ति के लिए वृद्धि क्रियाएं निष्पादित की जाती हैं। ध्यान दें कि words += NF
के लिए आशुलिपि है words = words + NF
.
योग अंतिम शब्द
<वाक्यविन्यास लैंग = awk> {एस + = $ एनएफ} अंत {प्रिंट एस + 0} </वाक्यविन्यास हाइलाइट>
s को $NF के सांख्यिक मान से बढ़ाया जाता है, जो AWK के क्षेत्र विभाजक (डिफ़ॉल्ट रूप से, व्हाइट-स्पेस) द्वारा परिभाषित रेखा पर अंतिम शब्द है। एनएफ वर्तमान पंक्ति में फ़ील्ड की संख्या है, उदा। 4. चूँकि $4 चौथे क्षेत्र का मान है, $NF पंक्ति में अंतिम क्षेत्र का मान है, इस बात की परवाह किए बिना कि इस रेखा में कितने क्षेत्र हैं, या इसमें आस-पास की रेखाओं की तुलना में अधिक या कम क्षेत्र हैं। $ वास्तव में उच्चतम ऑपरेटर प्राथमिकता वाला एक यूनरी ऑपरेटर है। (यदि लाइन में कोई फ़ील्ड नहीं है, तो NF 0 है, $0 पूरी लाइन है, जो इस मामले में संभावित व्हाइट-स्पेस के अलावा खाली है, और इसलिए इसका संख्यात्मक मान 0 है।)
इनपुट के अंत में END पैटर्न मेल खाता है, इसलिए s प्रिंट किया जाता है। हालाँकि, चूंकि इनपुट की कोई पंक्ति नहीं हो सकती है, जिस स्थिति में कभी भी कोई मान निर्दिष्ट नहीं किया गया है, यह डिफ़ॉल्ट रूप से एक खाली स्ट्रिंग होगा। एक चर में शून्य जोड़ना एक AWK मुहावरा है जो इसे एक स्ट्रिंग से संख्यात्मक मान तक ले जाने के लिए मजबूर करता है। (एक खाली स्ट्रिंग को जोड़ना एक संख्या से एक स्ट्रिंग के लिए ज़बरदस्ती करना है, उदाहरण के लिए s । ध्यान दें, स्ट्रिंग्स को जोड़ने के लिए कोई ऑपरेटर नहीं है, वे बस बगल में रखे गए हैं।) ज़बरदस्ती के साथ प्रोग्राम एक खाली इनपुट पर 0 प्रिंट करता है, इसके बिना, एक खाली लाइन छपी है।
इनपुट लाइनों की एक श्रृंखला का मिलान करें
<वाक्यविन्यास लैंग = awk> एनआर% 4 == 1, एनआर% 4 == 3 {printf% 6d% s\n, एनआर, $0} </वाक्यविन्यास हाइलाइट> एक्शन स्टेटमेंट प्रत्येक पंक्ति क्रमांकित प्रिंट करता है। Printf फ़ंक्शन मानक C Printf का अनुकरण करता है और ऊपर वर्णित प्रिंट कमांड के समान कार्य करता है। मिलान करने के लिए पैटर्न, हालांकि, निम्नानुसार काम करता है: एनआर रिकॉर्ड्स की संख्या है, आम तौर पर इनपुट की पंक्तियां, एडब्ल्यूके ने अब तक पढ़ा है, यानी इनपुट की पहली पंक्ति के लिए 1 से शुरू होने वाली वर्तमान पंक्ति संख्या। % मॉड्यूल ऑपरेशन ऑपरेटर है। एनआर% 4 == 1 पहली, 5वीं, 9वीं, आदि, इनपुट की पंक्तियों के लिए सत्य है। इसी प्रकार, एनआर% 4 == 3 इनपुट की तीसरी, 7वीं, 11वीं, आदि के लिए सही है। रेंज पैटर्न तब तक झूठा है जब तक कि पहला भाग लाइन 1 पर मेल नहीं खाता है, और तब तक सही रहता है और जब दूसरा भाग मेल खाता है, तब तक लाइन 3 पर होता है। यह तब तक झूठा रहता है जब तक कि पहला भाग लाइन 5 पर फिर से मेल नहीं खाता।
इस प्रकार, प्रोग्राम 1,2,3 पंक्तियों को प्रिंट करता है, रेखा 4 को छोड़ देता है, और फिर 5,6,7, और इसी तरह। प्रत्येक पंक्ति के लिए, यह पंक्ति संख्या (6 वर्ण-चौड़े फ़ील्ड पर) और फिर पंक्ति सामग्री को प्रिंट करता है। उदाहरण के लिए, जब इस इनपुट पर निष्पादित किया जाता है:
रोम फ़्लोरेंस मिलन नेपल्स ट्यूरिन वेनिस
पिछला कार्यक्रम प्रिंट करता है:
1 रोम 2 फ्लोरेंस 3 मिलान 5 ट्यूरिन 6 वेनिस
फ़ाइल के प्रारंभिक या अंतिम भाग को प्रिंट करना
एक विशेष मामले के रूप में, जब रेंज पैटर्न का पहला भाग लगातार सत्य होता है, उदा। 1, रेंज इनपुट की शुरुआत में शुरू होगी। इसी तरह, यदि दूसरा भाग लगातार असत्य है, उदा. 0, इनपुट के अंत तक सीमा जारी रहेगी। उदाहरण के लिए, <वाक्यविन्यास लैंग = awk>
/^--यहां काटें--$/, 0
</वाक्यविन्यास हाइलाइट> रेगुलर एक्सप्रेशन ^--कट हियर--$ से मेल खाने वाली पहली लाइन से इनपुट की लाइन प्रिंट करता है, यानी एक लाइन जिसमें केवल वाक्यांश --कट हियर-- होता है, अंत तक।
शब्द आवृत्तियों की गणना करें
साहचर्य सरणियों का उपयोग करते हुए शब्द आवृत्ति: <वाक्यविन्यास लैंग = awk> शुरू करना {
एफएस = [^ए-जेडए-जेड]+
} {
के लिए (i=1; i<=NF; i++) शब्द [tolower($i)]++
} समाप्त {
के लिए (मैं शब्दों में) प्रिंट मैं, शब्द [i]
} </वाक्यविन्यास हाइलाइट>
BEGIN ब्लॉक फ़ील्ड विभाजक को गैर-अल्फाबेटिक वर्णों के किसी भी क्रम में सेट करता है। ध्यान दें कि विभाजक रेगुलर एक्सप्रेशन हो सकते हैं। उसके बाद, हम एक नंगे क्रिया पर जाते हैं, जो प्रत्येक इनपुट लाइन पर क्रिया करता है। इस मामले में, लाइन पर प्रत्येक फ़ील्ड के लिए, हम उस शब्द की संख्या में एक जोड़ देते हैं, जो पहले लोअरकेस में कनवर्ट किया गया शब्द प्रकट होता है। अंत में, END ब्लॉक में, हम शब्दों को उनकी आवृत्तियों के साथ प्रिंट करते हैं। रेखा
के लिए (मैं शब्दों में)
एक लूप बनाता है जो सरणी शब्दों के माध्यम से जाता है, i को सरणी के प्रत्येक सबस्क्रिप्ट पर सेट करता है। यह अधिकांश भाषाओं से अलग है, जहां ऐसा लूप सरणी में प्रत्येक मान से होकर जाता है। लूप इस प्रकार प्रत्येक शब्द को उसकी आवृत्ति गणना के बाद प्रिंट करता है। tolower
पुस्तक प्रकाशित होने के बाद किए गए वन ट्रू ऑक (नीचे देखें) में एक अतिरिक्त था।
=== कमांड लाइन === से मैच पैटर्न
इस कार्यक्रम को कई तरह से दर्शाया जा सकता है। पहले वाला शेल स्क्रिप्ट बनाने के लिए बॉर्न शेल का उपयोग करता है जो सब कुछ करता है। यह इन विधियों में सबसे छोटा है: <वाक्यविन्यास लैंग = बैश>
- !/बिन/श
पैटर्न = $1
खिसक जाना
awk '/' $pattern '/ { Print FILENAME : $0 }' $@
</वाक्यविन्यास हाइलाइट> $pattern
e> awk कमांड में सिंगल कोट्स द्वारा संरक्षित नहीं है ताकि शेल वेरिएबल का विस्तार करे लेकिन रिक्त स्थान वाले पैटर्न को ठीक से संभालने के लिए इसे डबल कोट्स में डालने की आवश्यकता है। सामान्य तरीके से एक पैटर्न यह देखने के लिए जांच करता है कि क्या पूरी लाइन ($0
) मेल खाता है। FILENAME
वर्तमान फ़ाइल नाम शामिल है। awk का कोई स्पष्ट संयोजन संचालिका नहीं है; दो निकटवर्ती तार उन्हें जोड़ते हैं। $0
मूल अपरिवर्तित इनपुट लाइन तक फैलता है।
इसे लिखने के वैकल्पिक तरीके हैं। यह शेल स्क्रिप्ट पर्यावरण को सीधे awk के भीतर से एक्सेस करती है: <वाक्यविन्यास लैंग = बैश>
- !/बिन/श
निर्यात पैटर्न = $1 खिसक जाना awk '$0 ~ ENVIRON[ pattern ] { Print FILENAME : $0 }' $@ </वाक्यविन्यास हाइलाइट>
यह एक शेल स्क्रिप्ट है जो उपयोग करती है ENVIRON
, पुस्तक प्रकाशित होने के बाद One True awk के एक नए संस्करण में प्रस्तुत की गई एक सरणी। का सबस्क्रिप्ट ENVIRON
एक पर्यावरण चर का नाम है; इसका परिणाम चर का मान है। यह विभिन्न मानक पुस्तकालयों और पॉज़िक्स में getenv फ़ंक्शन की तरह है। शेल स्क्रिप्ट एक पर्यावरण चर बनाती है pattern
पहला तर्क शामिल है, फिर वह तर्क छोड़ देता है और प्रत्येक फ़ाइल में पैटर्न के लिए अजीब दिखता है।
~
यह देखने के लिए जाँच करता है कि क्या उसका बायाँ ऑपरेंड उसके दाएँ ऑपरेंड से मेल खाता है; !~
इसका उलटा है। ध्यान दें कि रेगुलर एक्सप्रेशन केवल एक स्ट्रिंग है और इसे वेरिएबल्स में संग्रहीत किया जा सकता है।
अगला तरीका कमांड-लाइन वेरिएबल असाइनमेंट का उपयोग करता है, जिसमें awk के तर्क को एक वेरिएबल के असाइनमेंट के रूप में देखा जा सकता है: <वाक्यविन्यास लैंग = बैश>
- !/बिन/श
पैटर्न = $1 खिसक जाना awk '$0 ~ पैटर्न { Print FILENAME : $0 }' pattern=$pattern $@ </वाक्यविन्यास हाइलाइट>
या आप -v var=value कमांड लाइन विकल्प (जैसे awk -v pattern= $pattern ...) का उपयोग कर सकते हैं।
अंत में, यह शुद्ध awk में लिखा गया है, बिना शेल की मदद के या awk स्क्रिप्ट के कार्यान्वयन के बारे में बहुत अधिक जानने की आवश्यकता के बिना (जैसा कि कमांड लाइन पर चर असाइनमेंट करता है), लेकिन थोड़ा लंबा है: <वाक्यविन्यास लैंग = awk> शुरू करना {
पैटर्न = एआरजीवी [1] for (i = 1; i <ARGC; i++) # पहले तर्क को हटा दें एआरजीवी [i] = एआरजीवी [i + 1] एआरजीसी-- अगर (एआरजीसी == 1) {# पैटर्न ही एकमात्र चीज थी, इसलिए मानक इनपुट से बल पढ़ें (पुस्तक द्वारा प्रयुक्त) एआरजीसी = 2 एआरजीवी [1] = - }
}
$0 ~ पैटर्न { Print FILENAME : $0 }
</वाक्यविन्यास हाइलाइट> BEGIN
e> न केवल पहले तर्क को निकालने के लिए आवश्यक है, बल्कि इसे बाद में फ़ाइल नाम के रूप में व्याख्या किए जाने से रोकने के लिए भी आवश्यक है BEGIN
ब्लॉक समाप्त होता है। ARGC
, तर्कों की संख्या, हमेशा ≥1 होने की गारंटी है, जैसा कि ARGV[0]
कमांड का नाम है जो स्क्रिप्ट को निष्पादित करता है, अक्सर स्ट्रिंग "awk"
. यह भी ध्यान दें ARGV[ARGC]
खाली स्ट्रिंग है, ""
. #
एक टिप्पणी आरंभ करता है जो पंक्ति के अंत तक विस्तृत होती है।
ध्यान दें if
खंड मैथा। awk केवल यह देखने के लिए जाँच करता है कि कमांड चलाने से पहले उसे मानक इनपुट से पढ़ना चाहिए या नहीं। इस का मतलब है कि
अजीब 'ठेला'
केवल इसलिए काम करता है क्योंकि तथ्य यह है कि कोई फ़ाइल नाम नहीं है, केवल पहले चेक किया गया है prog
चलाया जाता है! यदि आप स्पष्ट रूप से सेट करते हैं ARGC
से 1 ताकि कोई तर्क न हो, अजीब बस छोड़ देगा क्योंकि ऐसा लगता है कि कोई और इनपुट फाइल नहीं है। इसलिए,आपको विशेष फ़ाइल नाम के साथ मानक इनपुट से पढ़ने के लिए स्पष्ट रूप से कहने की आवश्यकता है -
.
स्व-निहित AWK स्क्रिप्ट्स
यूनिक्स जैसे ऑपरेटिंग सिस्टम पर शेबंग (यूनिक्स) सिंटैक्स का उपयोग करके स्व-निहित AWK स्क्रिप्ट का निर्माण किया जा सकता है।
उदाहरण के लिए, एक स्क्रिप्ट जो किसी फ़ाइल की सामग्री को प्रिंट करती है,नाम की फ़ाइल बनाकर बनाई जा सकती है print.awk
निम्नलिखित सामग्री के साथ:
<वाक्यविन्यास लैंग = awk>
- !/usr/bin/awk -f
{प्रिंट $0} </वाक्यविन्यास हाइलाइट>
इसके साथ आह्वान किया जा सकता है: ./print.awk <filename>
-f
e> एडब्ल्यूके को बताता है कि एडब्ल्यूके प्रोग्राम को पढ़ने के लिए जो तर्क दिया गया है,वह फ़ाइल है,जो कि वही ध्वज है जिसका उपयोग sed में किया जाता है। चूंकि वे अक्सर वन-लाइनर्स के लिए उपयोग किए जाते हैं,ये दोनों प्रोग्राम एक अलग फाइल के बजाय कमांड-लाइन तर्क के रूप में दिए गए प्रोग्राम को निष्पादित करने के लिए डिफ़ॉल्ट होते हैं।
संस्करण और कार्यान्वयन
एडब्ल्यूके मूल रूप से 1977 में लिखा गया था और संस्करण 7 यूनिक्स के साथ वितरित किया गया था।
1985 में इसके लेखकों ने भाषा का विस्तार करना शुरू किया, सबसे महत्वपूर्ण रूप से उपयोगकर्ता परिभाषित कार्यों को जोड़कर। 1988 में प्रकाशित पुस्तक द एडब्ल्यूके प्रोग्रामिंग लैंग्वेज में भाषा का वर्णन किया गया है, और इसका कार्यान्वयन यूनिक्स प्रणाली वी के प्रदर्शन में उपलब्ध कराया गया था। असंगत पुराने संस्करण के साथ भ्रम से बचने के लिए, इस संस्करण को कभी-कभी नया एडब्ल्यूके या नॉक कहा जाता था। यह कार्यान्वयन 1996 में एक मुफ्त सॉफ्टवेयर लाइसेंस के तहत जारी किया गया था और अभी भी ब्रायन कर्निघन द्वारा बनाए रखा गया है ।[citation needed]
यूनिक्स के पुराने संस्करण,जैसे यूनिक्स/32वी,शामिल हैं awkcc
,जिसने एडब्ल्यूके को C में बदल दिया। कर्निघन ने awk को C++ में बदलने के लिए एक प्रोग्राम लिखा; इसकी स्थिति ज्ञात नहीं है।[11]
- BWK awk, जिसे nawk के नाम से भी जाना जाता है, ब्रायन कर्निघन के संस्करण को संदर्भित करता है। मूल रूप से भाषा का वर्णन करने वाली पुस्तक के साथ इस शब्द के उपयोग के कारण इसे वन ट्रू एडब्ल्यूके करार दिया गया है और तथ्य यह है कि कर्निघन एडब्ल्यूके के मूल लेखकों में से एक थे।[4] FreeBSD इस संस्करण को one-true-awk के रूप में संदर्भित करता है।[12] इस संस्करण में ऐसी विशेषताएं भी हैं जो पुस्तक में नहीं हैं, जैसे
tolower
तथाENVIRON
जिनकी व्याख्या ऊपर की गई है; विवरण के लिए स्रोत संग्रह में FIXES फ़ाइल देखें। इस संस्करण का उपयोग, उदाहरण के लिए, Android (ऑपरेटिंग सिस्टम), FreeBSD, NetBSD, OpenBSD, macOS, और इलुमोस द्वारा किया जाता है। ब्रायन कर्निघन और अर्नोल्ड रॉबिंस, नॉक के लिए स्रोत रिपॉजिटरी में मुख्य योगदानकर्ता हैं: github.com /onetrueawk /awk. - gawk (GNU awk) एक और फ्री-सॉफ्टवेयर कार्यान्वयन है और एकमात्र कार्यान्वयन है जो अंतर्राष्ट्रीयकरण और स्थानीयकरण और TCP/IP नेटवर्किंग को लागू करने में गंभीर प्रगति करता है। यह मूल कार्यान्वयन के स्वतंत्र रूप से उपलब्ध होने से पहले लिखा गया था। इसमें अपना स्वयं का डिबगर शामिल है, और इसकी प्रोफाइलिंग (कंप्यूटर प्रोग्रामिंग) उपयोगकर्ता को एक स्क्रिप्ट के लिए मापित प्रदर्शन संवर्द्धन करने में सक्षम बनाती है। यह उपयोगकर्ता को साझा पुस्तकालयों के साथ कार्यक्षमता बढ़ाने में भी सक्षम बनाता है। कुछ Linux वितरणों में उनके डिफ़ॉल्ट एडब्ल्यूके कार्यान्वयन के रूप में गौक शामिल है।[citation needed]
- गॉक-सीएसवी। अल्पविराम से अलग किये गए मान एक्सटेंशन गॉक इनपुट और आउटपुट सीएसवी स्वरूपित डेटा को संभालने की सुविधा प्रदान करता है।[13]
- mawk माइक ब्रेनन द्वारा बाईटकोड दुभाषिया पर आधारित एक बहुत तेज़ एडब्ल्यूके कार्यान्वयन है।
- libmawk mawk का एक फोर्क है, जो एप्लिकेशन को awk दुभाषियों के कई समानांतर उदाहरणों को एम्बेड करने की अनुमति देता है।
- awka (जिसका फ्रंट एंड mawk प्रोग्राम के ऊपर लिखा हुआ है) C कोड में एडब्ल्यूके स्क्रिप्ट्स का एक और ट्रांसलेटर है। जब संकलित किया जाता है, लेखक के libawka.a सहित सांख्यिकीय रूप से, परिणामी निष्पादनयोग्य काफी तेज हो जाते हैं और लेखक के परीक्षणों के अनुसार, एडब्ल्यूके, पर्ल, या Tcl के अन्य संस्करणों के साथ बहुत अच्छी तरह से तुलना करते हैं। छोटी स्क्रिप्ट 160–170 kB के प्रोग्राम में बदल जाएँगी।
- tawk (थॉम्पसन AWK) Solaris (ऑपरेटिंग सिस्टम), DOS, OS/2, और Microsoft Windows के लिए एक AWK संकलक है, जो पहले थॉम्पसन ऑटोमेशन सॉफ्टवेयर द्वारा बेचा जाता था (जिसने अपनी गतिविधियाँ बंद कर दी हैं)।[14]
- Jawk Java (प्रोग्रामिंग लैंग्वेज) में AWK को लागू करने की एक परियोजना है, जिसे SourceForge पर होस्ट किया गया है।[15] एडब्ल्यूके स्क्रिप्ट्स (यानी, जावा थ्रेड्स, सॉकेट्स, संग्रह, आदि) के भीतर जावा सुविधाओं तक पहुंच प्रदान करने के लिए भाषा में एक्सटेंशन जोड़े गए हैं।
- xgawk gawk का एक कांटा है[16] जो गतिशील रूप से लोड करने योग्य पुस्तकालयों के साथ गॉक का विस्तार करता है। XMLgawk एक्सटेंशन को आधिकारिक GNU Awk रिलीज़ 4.1.0 में एकीकृत किया गया था।
- 'QSEAWK' QSE लाइब्रेरी में शामिल एक एम्बेडेड AWK दुभाषिया कार्यान्वयन है जो C (प्रोग्रामिंग भाषा) और C++ के लिए एम्बेडिंग अप्लिकेशन प्रोग्रामिंग अंतरफलक (API) प्रदान करता है।[17]
- libfawk सी में लिखा गया एक बहुत छोटा, केवल-फ़ंक्शन, रीएन्ट्रेंट, एम्बेड करने योग्य दुभाषिया है
- बिजीबॉक्स में दिमित्री ज़खारोव द्वारा लिखित एडब्ल्यूके कार्यान्वयन शामिल है। यह एम्बेडेड सिस्टम के लिए उपयुक्त एक बहुत छोटा कार्यान्वयन है।
- माइकल पार्कर द्वारा CLAWK एक ही लेखक की नियमित अभिव्यक्ति लाइब्रेरी के आधार पर सामान्य लिस्प में एडब्ल्यूके कार्यान्वयन प्रदान करता है।[18]
किताबें
यह भी देखें
संदर्भ
- ↑ 1.0 1.1 James W. Livingston (May 2, 1988). "ग्रेट ऑक प्रोग्राम नो बर्डब्रेन है". Digital Review. p. 91.
- ↑ Raymond, Eric S. "Applying Minilanguages". The Art of Unix Programming. Case Study: awk. Archived from the original on July 30, 2008. Retrieved May 11, 2010.
The awk action language is Turing-complete, and can read and write files.
- ↑ Aho, Alfred V.; Kernighan, Brian W.; Weinberger, Peter J. (September 1, 1978). Awk - एक पैटर्न स्कैनिंग और प्रोसेसिंग लैंग्वेज (दूसरा संस्करण) (Technical report). Unix Seventh Edition Manual, Volume 2. Bell Telephone Laboratories, Inc. Retrieved February 1, 2020.
- ↑ 4.0 4.1 Aho, Alfred V.; Kernighan, Brian W.; Weinberger, Peter J. (1988). AWK प्रोग्रामिंग लैंग्वेज. Addison-Wesley Publishing Company. ISBN 9780201079814. Retrieved 16 May 2015.
- ↑ "UNIX विशेष: प्रोफेसर कर्निघन और ब्रिल्सफ़ोर्ड". Computerphile. September 30, 2015. Archived from the original on 2021-11-22.
- ↑ "एकल यूनिक्स विशिष्टता, संस्करण 3, यूटिलिटीज इंटरफेस टेबल". Archived from the original on 2018-01-05. Retrieved 2005-12-18.
- ↑ "Chapter 15. Commands and Utilities". लिनक्स मानक आधार कोर विशिष्टता 4.0 (Technical report). Linux Foundation. 2008. Archived from the original on 2019-10-16. Retrieved 2020-02-01.
- ↑ 8.0 8.1 8.2 Robbins, Arnold (March 2014). "GNU प्रोजेक्ट और मैं: GNU AWK के साथ 27 साल" (PDF). skeeve.com. Archived (PDF) from the original on October 6, 2014. Retrieved October 4, 2014.
- ↑ Dougherty, Dale; Robbins, Arnold (1997). मास्टर और ओक (2nd ed.). Sebastopol, CA: O'Reilly. p. 221. ISBN 1-565-92225-5.
- ↑ 10.0 10.1 "रिकॉर्ड्स (GNU Awk यूजर गाइड)". Archived from the original on 2020-06-14. Retrieved 2020-05-23.
- ↑ Kernighan, Brian W. (April 24–25, 1991). AWK से C++ अनुवादक (PDF). Usenix C++ Conference. Washington, DC. pp. 217–228. Archived (PDF) from the original on 2020-06-22. Retrieved 2020-02-01.
- ↑ "AWK awk को FreeBSD कोर में आयात करने के लिए FreeBSD कार्य लॉग". May 16, 2005. Archived from the original on September 8, 2013. Retrieved September 20, 2006.
- ↑ gawk-csv documentation at http://gawkextlib.sourceforge.net/csv/gawk-csv.html Archived 2020-03-25 at the Wayback Machine
- ↑ James K. Lawless (May 1, 1997). "TAWK कंपाइलर की जांच". Dr. Dobb's Journal. Archived from the original on February 21, 2020. Retrieved February 21, 2020.
- ↑ "SourceForge पर जॉक". Archived from the original on 2007-05-27. Retrieved 2006-08-23.
- ↑ "xgawk होम पेज". Archived from the original on 2013-04-18. Retrieved 2013-05-07.
- ↑ "GitHub पर QSEAWK". GitHub. Archived from the original on 2018-06-11. Retrieved 2017-09-06.
- ↑ "गिटहब पर CLAWK". GitHub. Archived from the original on 2021-08-25. Retrieved 2021-06-01.
अग्रिम पठन
- Andy Oram (May 19, 2021). "Awk: The Power and Promise of a 40-Year-Old Language". Fosslife. Retrieved June 9, 2021.
- Hamilton, Naomi (May 30, 2008). "The A-Z of Programming Languages: AWK". Computerworld. Retrieved 2008-12-12. – Interview with Alfred V. Aho on AWK
- Robbins, Daniel (2000-12-01). "Awk by example, Part 1: An intro to the great language with the strange name". Common threads. IBM DeveloperWorks. Retrieved 2009-04-16.
- Robbins, Daniel (2001-01-01). "Awk by example, Part 2: Records, loops, and arrays". Common threads. IBM DeveloperWorks. Retrieved 2009-04-16.
- Robbins, Daniel (2001-04-01). "Awk by example, Part 3: String functions and ... checkbooks?". Common threads. IBM DeveloperWorks. Archived from the original on 19 May 2009. Retrieved 2009-04-16.
- AWK – Become an expert in 60 minutes
- The Single UNIX Specification, Version 4 from The Open Group : pattern scanning and processing language – Shell and Utilities Reference,
- Linux User Manual – User Commands –
बाहरी संबंध
- The Amazing Awk Assembler by Henry Spencer.
- एडब्ल्यूके at Curlie
- awklang.org The site for things related to the awk language