सरल 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
ताकि यह पैटर्न के साथ रेखा को शामिल कर सके।