2011-10-03 16 views
5

मेरे पास एक बहुत बड़ी फ़ाइल 100 एमबी + है जहां सभी सामग्री एक पंक्ति पर है। मैं उस फ़ाइल में एक पैटर्न और उस पैटर्न के चारों ओर कई पात्रों को ढूंढना चाहता हूं।एक बहुत बड़ी सिंगल लाइन फ़ाइल में एक पैटर्न और आसपास की सामग्री कैसे खोजें?

उदाहरण के लिए मैं नीचे से एक की तरह एक कमांड कॉल करना चाहते हैं, लेकिन जहां -एक और -B बाइट्स की नहीं संख्या पंक्तियां हैं:

cat very_large_file | grep -A 100 -B 100 somepattern 
इस तरह की एक फ़ाइल युक्त सामग्री के लिए

तो:

1234567890abcdefghijklmnopqrstuvwxyz 

890abc 
and a before size of -B 3 
and an after size of -A 3 

का एक पैटर्न के साथ

मैं इसे वापस करना चाहते:

01,235,
567890abcdef 

कोई भी सुझाव बहुत अच्छा होगा। बहुत धन्यवाद।

उत्तर

11

आप -ओ विकल्प की कोशिश कर सकते:

-o, --only-matching 
     Show only the part of a matching line that matches PATTERN. 

और अपने आकार से मिलान करने के लिए रेगुलर एक्सप्रेशन का उपयोग और 3 पूर्ववर्ती/निम्न वर्णों यानी

grep -o -P ".{3}pattern.{3}" very_large_file 

उदाहरण आप दे दी है, इसमें

echo "1234567890abcdefghijklmnopqrstuvwxyz" > tmp.txt 
grep -o -P ".{3}890abc.{3}" tmp.txt 
+0

क्षमा करें, नियमित अभिव्यक्ति के लिए सही विकल्प -पी, –

+0

-E नहीं आह है बेशक - महान काम पूरी तरह से बहुत धन्यवाद। – emson

+0

@emson: स्वागत है :) मुझे खुशी है कि इससे मदद मिली। –

3

ऐसा करने का सबसे अच्छा तरीका मैं इसे एक छोटी पर्ल स्क्रिप्ट के साथ सोच सकता हूं।

#!/usr/bin/perl 
$pattern = $ARGV[0]; 
$before = $ARGV[1]; 
$after = $ARGV[2]; 

while(<>) { 
    print $& if(/.{$before}$pattern.{$after}/); 
} 

फिर आप यह thusly पर अमल होगा:

cat very_large_file | ./myPerlScript.pl 890abc 3 3 

संपादित करें: डैंग, पाओलो के समाधान बहुत आसान है। ओह ठीक है, विवा ला पर्ल!

+1

ठीक है, जब कोई नियमित अभिव्यक्तियों के बारे में सोचता है, तो पर्ल मूल भाषा की तरह है ... अनुमान है कि मेरी जीआरपी लाइन में -पी क्या है :)? –

4

साथ एक और एक sed (आप इसे सिस्टम पर जहां जीएनयू ग्रेप उपलब्ध नहीं है आवश्यकता हो सकती है):

sed -n ' 
    s/.*\(...890abc...\).*/\1/p 
    ' infile 
संबंधित मुद्दे