पैटर्न खोजने के बाद ही आउटपुट प्रिंट करें


13

एक स्क्रिप्ट है (इसे कॉल करें echoer) जो सूचनाओं के एक समूह को प्रदर्शित करने के लिए प्रिंट करता है। मैं एक पैटर्न पाया जाता है के बाद केवल लाइनों को देखने में सक्षम होना चाहते हैं।

मैं एक समाधान के उपयोग की कल्पना करता हूं जैसे कि कुछ दिखता है

echoer | solution_command <pattern>

आदर्श रूप patternसे एक नियमित अभिव्यक्ति होगी, लेकिन कठिन मूल्य तार मेरे लिए पर्याप्त होगा।


तो पैटर्न कई तार हो सकते हैं?
inian

एक ग्लोब? क्या आपका मतलब नियमित अभिव्यक्ति से है? ग्लब्स केवल फ़ाइल नाम विस्तार के लिए समझ में आता है।
terdon

@ मुझे यकीन नहीं है कि मैं इस सवाल को समझता हूं। क्या आप यह पूछना चाहते हैं कि क्या मैं चाहता हूं कि यह कार्य विघटन के साथ हो?
user23146

जवाबों:


21

AWK पैटर्न रेंज के साथ ऐसा कर सकता है, जो किसी भी नियमित अभिव्यक्ति के उपयोग की अनुमति देता है:

echoer | awk '/pattern/,0'

echoerपहली पंक्ति के मिलान से शुरू होने वाले आउटपुट को प्रिंट करेगा pattern

AWK पैटर्न-आधारित है, और आमतौर पर इसका उपयोग "यदि यह पैटर्न मेल खाता है, तो करें" के साथ किया जाता है। "यह पैटर्न" पैटर्न की एक सीमा हो सकती है, जिसे "जब यह पैटर्न मेल खाता है, तब तक इसे करना शुरू करें, जब तक कि यह अन्य पैटर्न से मेल नहीं खाता"; यह ऊपर के रूप में अल्पविराम द्वारा अलग किए गए दो पैटर्न लिखकर निर्दिष्ट किया गया है। पैटर्न टेक्स्ट मैच हो सकते हैं, जैसे कि /pattern/, जहां वर्तमान लाइन को पैटर्न के खिलाफ जांचा जाता है, एक नियमित अभिव्यक्ति के रूप में व्याख्या की जाती है; वे सामान्य भाव भी हो सकते हैं, प्रत्येक पंक्ति के लिए मूल्यांकन किया जा सकता है, और यदि उनका परिणाम गैर-शून्य या गैर-रिक्त है, तो मिलान करने के लिए माना जाता है।

AWK में, डिफ़ॉल्ट क्रिया वर्तमान लाइन को प्रिंट करना है।

यह सब एक साथ रखकर, awk '/pattern/,0'लाइनों के मिलान की तलाश करता है pattern, और एक बार जब यह मिल जाता है, तो सभी लाइनों पर डिफ़ॉल्ट कार्रवाई लागू होती है जब तक कि 0स्थिति मैच नहीं होती है (गैर-शून्य है)। awk '/pattern/,""'काम भी करेगा।

Gawk मैनुअल और अधिक विस्तार में चला जाता है।


3
मुझे रेंज के अंत के रूप में शून्य के साथ सीमा शब्दार्थ के बारे में पता नहीं था। धन्यवाद!
Kusalananda

@StephenKitt यह बहुत अच्छा है! क्या होगा अगर मैं मिलान होने तक प्रिंट करना चाहता था 0? यह होगा /pattern/,/0/? स्पष्ट रूप से डिफ़ॉल्ट कार्रवाई लिखने से उत्तर कैसा दिखेगा?
user23146

@ user23146 हाँ, /pattern/,/0/तब तक छपेगा जब तक कि उसे "0" वाली लाइन (रिकॉर्ड) नहीं मिल जाती। एक स्पष्ट कार्रवाई के साथ उत्तर में स्निपेट लिखना /pattern/,0 { print $0 }, या समकक्षता देता है /pattern/,0 { print }
स्टीफन किट

7

sed@ स्टीफनकिट awkएक के अनिवार्य समकक्ष :

sed '/pattern/,$!d'

patternवहाँ एक के रूप में व्याख्या की है बुनियादी नियमित अभिव्यक्ति में की तरह grep(के रूप में करने का विरोध किया विस्तारित नियमित अभिव्यक्ति में awk/ egrep/ grep -E)। कुछ sedकार्यान्वयन में एक -E(BSD, ast, हाल ही में GNU / बिजीबॉक्स, जल्द ही POSIX) या -r(GNU, ssed, बिजीबॉक्स, कुछ हाल ही में BSD) विकल्प हैं, ताकि इसके बजाय इसे विस्तारित रेगुलर एक्सप्रेशन बनाया जा सके और इसे बनाने के लिए कुछ -P(ast) या -R(ssed) हों। एक पर्ल की तरह नियमित अभिव्यक्ति।

के साथ perl:

perl -ne 'print if /pattern/ .. undef'

4

GNU और * BSD grep के साथ:

grep -A1000000000 pattern file

जब तक आपकी फ़ाइल में 1M से अधिक लाइनें न हों, बस।


0

यदि आप एक पेजर का उपयोग कर रहे हैं जैसे lessकि कमांड से आउटपुट देखना

less +pattern

0

awk पहले पैटर्न मैच के बाद (लेकिन शामिल नहीं) लाइनों के लिए

यदि ट्रिगर पैटर्न वाली लाइन "CUT HERE" के बराबर है, तो आप इसे मुद्रित आउटपुट से छोड़ सकते हैं:

echoer | awk 'flag ; /pattern/ { flag=1 }'

Awk कोड में इनपुट की प्रत्येक लाइन दो घटकों के माध्यम से चलती है। पहला घटक है flag, जो awk "लाइन को प्रिंट करता है यदि वैरिएबल flagनॉनजरो है" के रूप में व्याख्या करता है। चूंकि awk variables 0 डिफ़ॉल्ट रूप से होते हैं, इसलिए यह शुरू में कुछ भी प्रिंट नहीं करेगा।

दूसरा घटक, /pattern/ { flag=1 }ध्वज को 1 पर सेट करता है जैसे ही यह पैटर्न का पता लगाता है, और ध्वज बाकी के लिए उस मूल्य को रखता है।

जब तक पैटर्न का पहली बार पता चलता है, तब तक इनपुट की उस लाइन को प्रिंट करने का अवसर बीत चुका होता है। बाद की कोई भी लाइनें (पैटर्न वाली अतिरिक्त लाइनें सहित) प्रिंट करेंगी।


0

दे घुमा के

थोड़ा क्लंकी, लेकिन यह काम करता है।

#!/bin/bash
found=false
while IFS= read -r; do
    if $found || [[ $REPLY =~ pattern ]]; then
        found=true
        printf '%s\n' "$REPLY"
    fi
done

यह संस्करण निर्भर करता है cat, लेकिन इसे समझना आसान है।

#!/bin/bash
while IFS= read -r; do
    if [[ $REPLY =~ pattern ]]; then
        printf '%s\n' "$REPLY"
        break
    fi
done
cat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.