ম্যাচের আগে এবং পরে গ্রেট চরিত্রগুলি?


144

এটি ব্যবহার করে:

grep -A1 -B1 "test_pattern" file

ফাইলটিতে মিলিত প্যাটার্নের আগে এবং পরে একটি লাইন তৈরি করবে will লাইনগুলি নয় তবে বর্ণের একটি নির্দিষ্ট সংখ্যার প্রদর্শন করার জন্য কি কোনও উপায় আছে?

আমার ফাইলে লাইনগুলি বেশ বড় তাই আমি পুরো লাইনটি মুদ্রণ করতে আগ্রহী নই বরং কেবল প্রসঙ্গে ম্যাচটি পর্যবেক্ষণ করছি। কোন পরামর্শ কিভাবে এই কাজ করতে?


উত্তর:


184

3 টি অক্ষর আগে এবং পরে 4 টি অক্ষর

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

5
অল্প পরিমাণে উপাত্তের জন্য একটি ভাল উত্তর, তবে আপনি> ১০০ টি অক্ষরের সাথে মিলে গেলে এটি ধীরে ধীরে শুরু হয়ে যায় - যেমন আমার জায়ান্ট এক্সএমএল ফাইলটিতে, আমি এর আগে ও পরে {1,200 want চাই এবং এটি ব্যবহার করা খুব ধীর।
বেনুবার্ড

3
@Amit_g এর দ্বারা প্রস্তুত সংস্করণটি আরও দ্রুত।
ssobczak

6
ম্যাক ওএসএক্সে উপলভ্য নয়, সুতরাং এটি কোনও বহুল উপলভ্য সমাধান নয়। -E সংস্করণ (নীচে তালিকাভুক্ত) একটি ভাল সমাধান। -পি কি? পড়ুন ... -পি, --perl-regexp পার্ল নিয়মিত অভিব্যক্তি হিসাবে PATTERN ব্যাখ্যার (পিসিআরই, নীচে দেখুন)। এটি অত্যন্ত পরীক্ষামূলক এবং গ্রেপ-পি অযৌক্তিক বৈশিষ্ট্যগুলি সম্পর্কে সতর্ক করতে পারে।
Xofo

2
ওএসএক্স-এর মাধ্যমে ইনস্টল করুন: brew install homebrew/dupes/grepএবং এটি চালান ggrep
কেনারব

1
@ বেনুবার্ডের দ্বারা সূচিত হিসাবে, ম্যাচের লক্ষ্যের জন্য পছন্দসই পরিমিত প্রশস্ত পারিপার্শ্বিকতা সহ বিশাল ফাইলগুলির জন্য এটি কার্য সম্পাদন-ভিত্তিক অসম্ভব।
ম্যাটানস্টার

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

এটি আপনার প্যাটার্নের আগে এবং পরে 5 টি অক্ষরের সাথে মিলবে। -ও সুইচটি গ্রেপকে কেবল ম্যাচটি প্রদর্শন করতে বলে এবং -E একটি বর্ধিত নিয়মিত এক্সপ্রেশন ব্যবহার করতে। আপনার অভিব্যক্তিটির চারপাশে উদ্ধৃতিগুলি রাখার বিষয়টি নিশ্চিত করুন, অন্যথায় এটি শেল দ্বারা ব্যাখ্যা করা হতে পারে।


1
উত্তম উত্তর, আকর্ষণীয় যে এটি 2 ^ 8-1 এ দৈর্ঘ্যের জন্য}} যাতে {0,255}কাজগুলি {0,256}দেয়grep: invalid repetition count(s)
কোডমানকি

আমি ম্যাচের চরগুলির সংখ্যা বাড়ানোর সাথে এটি যথেষ্ট কম পারফরম্যান্স পেয়েছে বলে মনে হচ্ছে (5 -> 25 -> 50) কেন কোনও ধারণা?
অ্যাডাম হিউজেস

37

আপনি ব্যবহার করতে পারেন

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

2
এমনকি কিছুটা বড় ফাইলের সাথেও দুর্দান্তভাবে কাজ করে
8-02

4
আপনি প্রতি লাইনে একাধিক মিল খুঁজে পেতে এটি কীভাবে ব্যবহার করতে পারেন?
koox00

1
কোঁকড়া-বন্ধনী যুক্ত প্রথম সংখ্যাটির তাত্পর্যটি কী? "গ্রেপ-ই -ও" তে 0 এর দশকের মতো। 0,5} টেস্ট_প্যাটার্ন। {0,5? "Test.txt"?
লিউ রকওয়েল ফ্যান

এটি সত্যিই দ্রুত তবে @ একসেসের উত্তরের মতো নির্ভুল নয়।
আব্দুল্লাহ

24

আপনার অর্থ, এর মতো:

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

?

এটি উভয় পক্ষের বিশ অক্ষর মুদ্রণ করবে test_pattern\{0,20\}স্বরলিপি মত হল *, কিন্তু নির্দিষ্ট করে পরিবর্তে শূন্য বিশ পুনরাবৃত্তির করার শূন্য বা more.The -oশুধুমাত্র ম্যাচ নিজেই, বরং সমগ্র লাইন চেয়ে দেখানোর জন্য বলল।


এই আদেশটি আমার পক্ষে কাজ করছে না:grep: Invalid content of \{\}
আলেকজান্ডার প্রভিন উদ্দিন

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

এটি কেবল অক্ষরগুলির পরিবর্তে শব্দের ক্ষেত্রেও প্রয়োগ করা যেতে পারে ollow প্রকৃত মিলের স্ট্রিংয়ের আগে একটি শব্দ মুদ্রণ করবে ollow

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

নিম্নলিখিতটি প্যাটার্নের পরে একটি শব্দ মুদ্রণ করবে:

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

0

আপনি হাইলাইটের জন্য + সেকেন্ড গ্রেপ সন্ধানের জন্য রেজিপেক্স গ্রেপ ব্যবহার করতে পারেন

echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}' | grep string

23_string_and

এখানে চিত্র বর্ণনা লিখুন


0

আমি এই ক্রিপ্টিক কমান্ড সংশোধকগুলিকে সহজেই কখনও স্মরণ করব না তাই আমি শীর্ষ উত্তরটি নিয়েছি এবং এটি আমার ~/.bashrcফাইলে একটি ফাংশনে পরিণত করেছি :


cgrep() {
    # For files that are arrays 10's of thousands of characters print.
    # Use cpgrep to print 30 characters before and after search patttern.
    if [ $# -eq 2 ] ; then
        # Format was 'cgrep "search string" /path/to/filename'
        grep -o -P ".{0,30}$1.{0,30}" "$2"
    else
        # Format was 'cat /path/to/filename | cgrep "search string"
        grep -o -P ".{0,30}$1.{0,30}"
    fi
} # cgrep()

এটি ক্রিয়ায় দেখতে কেমন লাগে তা এখানে:

$ ll /tmp/rick/scp.Mf7UdS/Mf7UdS.Source

-rw-r--r-- 1 rick rick 25780 Jul  3 19:05 /tmp/rick/scp.Mf7UdS/Mf7UdS.Source

$ cat /tmp/rick/scp.Mf7UdS/Mf7UdS.Source | cgrep "Link to iconic"

1:43:30.3540244000 /mnt/e/bin/Link to iconic S -rwxrwxrwx 777 rick 1000 ri

$ cgrep "Link to iconic" /tmp/rick/scp.Mf7UdS/Mf7UdS.Source

1:43:30.3540244000 /mnt/e/bin/Link to iconic S -rwxrwxrwx 777 rick 1000 ri

প্রশ্নে থাকা ফাইলটি একটানা 25 কে লাইন এবং আপনি নিয়মিত কী ব্যবহার করছেন তা খুঁজে পাওয়া আশাবাদী grep

দুটি ভিন্ন ভিন্ন উপায়ে আপনি cgrepসেই সমান্তরকে কল করতে পারেন তা লক্ষ্য করুনgrep পদ্ধতিতে

ফাংশনটি তৈরি করার একটি "নিফটিয়ার" উপায় রয়েছে যেখানে "$ 2" কেবল তখনই পাস করা হয় যা 4 লাইন কোড সংরক্ষণ করবে would যদিও এটি আমার হাতে নেই। কিছু একটা ${parm2} $parm2। যদি আমি এটি খুঁজে পাই তবে আমি ফাংশন এবং এই উত্তরটি সংশোধন করব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.