सरल awkउपाय:
मान लें कि मिलान लाइनों को खोजने के लिए उपयोग करने के लिए नियमित अभिव्यक्ति शेल चर में संग्रहीत की जाती है $regex, और लाइनों को छोड़ने के लिए गिनती में $count।
यदि मिलान रेखा को भी छोड़ दिया जाना चाहिए ( $count + 1रेखाएँ छोड़ दी जाती हैं):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
यदि मैचिंग लाइन को छोड़ना नहीं चाहिए ( मैच समाप्त होने के बाद वाली $countलाइनें ):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
स्पष्टीकरण:
-v regex="$regex" -v count="$count"समान नाम के शेल चर awkपर आधारित चर को परिभाषित करता है ।
$0 ~ regex ब्याज की रेखा से मेल खाता है
{ skip=count; next }स्किप काउंट को इनिशियलाइज़ करता है और नेक्स्ट लाइन पर आगे बढ़ता है, मैचिंग लाइन को प्रभावी ढंग से स्किप करता है; दूसरे समाधान में, printपहले nextयह सुनिश्चित करता है कि इसे छोड़ दिया नहीं गया है ।
--skip >= 0 स्किप काउंट को घटाता है और कार्रवाई करता है अगर यह (अभी भी) = = 0 है, तो इसका मतलब है कि हाथ की रेखा को छोड़ दिया जाना चाहिए।
{ next } अगली पंक्ति के लिए आगे बढ़ता है, प्रभावी ढंग से वर्तमान रेखा को लंघन करता है
1के लिए आमतौर पर इस्तेमाल किया जाने वाला शॉर्टहैंड है { print }; यह है, वर्तमान लाइन बस मुद्रित किया जाता है
- केवल गैर-मिलान और गैर-स्किप की गई पंक्तियाँ इस आदेश तक पहुँचती हैं।
- इसका कारण यह
1है { print }कि 1यह एक बूलियन पैटर्न के रूप में व्याख्या की जाती है जो परिभाषा के अनुसार हमेशा सही का मूल्यांकन करता है, जिसका अर्थ है कि इसकी संबद्ध क्रिया (ब्लॉक) बिना शर्त के निष्पादित होती है। चूंकि इस मामले में कोई संबद्ध कार्रवाई नहीं है , लाइन awkको प्रिंट करने में चूक ।
+Nपैटर्न एक GNU एक्सटेंशन है। अपने दूसरे उदाहरण में पहलेnको बदलेंNताकि यह पैटर्न के साथ रेखा को शामिल कर सके।