2011-11-12 28 views
83

इस का उपयोग करते हुए:मैच से पहले और बाद में Grep वर्ण?

grep -A1 -B1 "test_pattern" file 

से पहले और फ़ाइल में मिलान पैटर्न के बाद एक लाइन का उत्पादन करेगा। क्या लाइनों को प्रदर्शित करने का कोई तरीका नहीं है लेकिन वर्णों की एक निर्दिष्ट संख्या है?

मेरी फ़ाइल में रेखाएं बहुत बड़ी हैं इसलिए मुझे पूरी लाइन प्रिंट करने में दिलचस्पी नहीं है बल्कि संदर्भ में मैच का निरीक्षण करें। इस संबंध में कोई सुझाव कि इसे कैसे किया जा सकता है?

उत्तर

103

3 अक्षर और 4 अक्षर इस्तेमाल कर सकते हैं तुम्हारा मतलब है, इस तरह:

grep -o '.\{0,20\}test_pattern.\{0,20\}' file 

?

यह test_pattern के दोनों ओर बीस वर्णों को प्रिंट करेगा। \{0,20\} नोटेशन * जैसा है, लेकिन शून्य या अधिक के बजाय शून्य से बीस पुनरावृत्ति निर्दिष्ट करता है। -o पूरी लाइन के बजाए केवल मैच ही दिखाता है।

+4

डेटा की थोड़ी मात्रा के लिए एक अच्छा जवाब है, लेकिन जब आप मिलान कर रहे हैं तो यह धीमा हो रहा है> 100 वर्ण - उदा। मेरी विशाल xml फ़ाइल में, मैं पहले और बाद में {1,200} चाहता हूं, और इसका उपयोग करना बहुत धीमा है। – Benubird

+3

@amit_g द्वारा अजीब संस्करण बहुत तेज़ है। – ssobczak

+1

मैक ओएसएक्स पर उपलब्ध नहीं है, इसलिए वास्तव में यह व्यापक रूप से उपलब्ध समाधान नहीं है। -ई संस्करण (नीचे सूचीबद्ध) एक बेहतर समाधान है। -पी क्या है? पढ़ें ... -P, --perl-regexp पर्ल नियमित रूप से पर्ल नियमित अभिव्यक्ति के रूप में व्याख्या करें (पीसीआरई, नीचे देखें)। यह अत्यधिक प्रयोगात्मक है और grep -P अनुपूरक सुविधाओं की चेतावनी दे सकता है। – Xofo

23

आप के बाद

$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}' 
23_string_and 
+2

echo hey there how are you |perl -lne 'print $1 if /(\w+) there/' hey 

पैटर्न के बाद एक शब्द प्रिंट होगा के बाद कुछ बड़ी फ़ाइलों के साथ भी अच्छी तरह से काम करता है – Touko

+3

प्रति पंक्ति एकाधिक मिलान खोजने के लिए आप इसका उपयोग कैसे कर सकते हैं? – koox00

+0

क्या कोई इसे एकाधिक मैचों के लिए अपडेट कर सकता है? – Pranab

11

से पहले

awk '/test_pattern/ { 
    match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20); 
}' file 
+0

यह आदेश मेरे लिए काम नहीं कर रहा है: 'grep: \ {\} ' –

+0

की अवैध सामग्री यह ओएसएक्स टर्मिनल में काम करता है। – hapi

70
grep -E -o ".{0,5}test_pattern.{0,5}" test.txt 

यह आपके पैटर्न से पहले और बाद में 5 वर्णों से मेल खाएगा। -o स्विच grep को केवल एक विस्तृत नियमित अभिव्यक्ति का उपयोग करने के लिए मैच दिखाने के लिए बताता है। अपने अभिव्यक्ति के चारों ओर उद्धरण डालना सुनिश्चित करें, अन्यथा इसे खोल द्वारा व्याख्या किया जा सकता है।

0
gawk साथ

, तो आप मिलान फ़ंक्शन का उपयोग कर सकते हैं:

x="hey there how are you" 
    echo "$x" |awk --re-interval '{match($0,/(.{4})how(.{4})/,a);print a[1],a[2]}' 
    ere are 

आप perl ठीक लगता है, और अधिक लचीला समाधान: निम्नलिखित तीन पात्रों प्रिंट होगा से पहले पैटर्न पैटर्न के बाद 5 चरित्र वास्तविक पैटर्न के बाद और फिर ।

echo hey there how are you |perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/' 
ey there how 

यह भी सिर्फ characters.Following के बजाय शब्दों के लिए लागू किया जा सकता वास्तविक से मिलता जुलता स्ट्रिंग से पहले एक शब्द प्रिंट होगा।

echo hey there how are you |perl -lne 'print $2 if /(\w+) there (\w+)/' 
how 

पैटर्न से पहले एक शब्द प्रिंट होगा के बाद, तो वास्तविक शब्द और पैटर्न के बाद तो एक शब्द:

echo hey there how are you |perl -lne 'print "$1$2$3" if /(\w+)(there)(\w+)/' 
hey there how 
संबंधित मुद्दे