কিভাবে একটি নির্দিষ্ট প্যাটার্নের ভিত্তিতে লাইন গ্রেপ করবেন?


8

ধরা যাক আমার কাছে দুটি ফাইলের নীচে একটি ফাইল রয়েছে:

2014-05-05      09:11:53    /aa/bbbb/cccccc             29899
2014-05-05      09:12:17    /aa/bbbb/cccccc?dddddddd    16767 

আমার /aa/bbbb/ccccccকেবল প্যাটার্নযুক্ত লাইনটি পাওয়া দরকার , আমার অতিরিক্ত অক্ষর যুক্ত দ্বিতীয় লাইনের প্রয়োজন নেই ?dddddddd। এখন যখন আমি চেষ্টা করেছি

grep '/aa/bbbb/cccccc' file

তারপরে লাইন দুটিই নির্বাচন করা হচ্ছে। আমার সম্পূর্ণ লাইন দরকার তাই grep -oসমাধান হতে পারে না।

গ্রেপ ব্যবহার করে কী কী সম্ভাব্য সমাধান হতে পারে যাতে অনুসন্ধান প্যাটার্নের ভিত্তিতে কেবল প্রথম লাইনটি নির্বাচিত হয়?

উত্তর:


7

নীচে গ্রেপ কমান্ডটি ব্যবহার করুন যা প্যারামিটার ব্যবহার করে -P( পার্ল-রেজিএক্সপ্যাক্ট )।

grep -P '(?<!\S)/aa/bbbb/cccccc(?!\S)' file
  • (?<!\S)এই নেতিবাচক চেহারাটি দৃ as়ভাবে দাবি করে যে স্ট্রিংয়ের পূর্বে যে চরিত্রটি /aa/bbbb/ccccccকোনও স্থান নয়, তবে কোনও ফাঁকা স্থান নয়।

  • (?!\S) নেতিবাচক বর্ণনাহিনী দৃser়ভাবে দাবি করে যে ম্যাচটি অনুসরণকারী চরিত্রটি কোনও স্থান নয়, তবে কোনও স্থান নয়।

অন্য গ্রেপ,

 grep -E '(^|\s)/aa/bbbb/cccccc(\s|$)' file

অজগর মাধ্যমে,

script.py

#!/usr/bin/python3
import re
import sys
file = sys.argv[1]
with open(file, 'r') as f:
    for line in f:
        for i in line.split():
            if i == "/aa/bbbb/cccccc":
                print(line, end='')

উপরের কোডটি একটি ফাইলে সংরক্ষণ করুন এবং নাম হিসাবে দিন script.py। তারপরে উপরের স্ক্রিপ্টটি সম্পাদন করুন

python3 script.py /path/to/the/file/you/want/to/work/with

ধন্যবাদ মানুষ. বিটিডব্লিউ পার্ল রেজেক্সের পরিবর্তে সাধারণ / বর্ধিত রেজেক্স ব্যবহার করে করা যেতে পারে?
হিমাইল

1
টেরডন পোস্ট করার মতো, আপনি সহজেই করতে পারেনgrep '/aa/bbbb/cccccc ' file
অবিনাশ রাজ

তবে উপরেরগুলি কেবল /aa/bbbb/ccccccস্ট্রিংযুক্ত লাইনগুলি মুদ্রণ করবে না ।
অবিনাশ রাজ

আপনি grep -E '/aa/bbbb/cccccc(\s+|$)' file
এটির

হ্যাঁ, এর মতোgrep -E '(^|\s)/aa/bbbb/cccccc(\s|$)' file
অবিনাশ রাজ

10

সবচেয়ে সহজ উপায় হ'ল আপনার প্যাটার্নের পরে কোনও স্থান যুক্ত করা:

$ grep '/aa/bbbb/cccccc ' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899

বা, সমস্ত ধরণের সাদা স্থানের সাথে মেলে:

$ grep  '/aa/bbbb/cccccc[[:space:]]' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899

অথবা

$ grep -P '/aa/bbbb/cccccc\s+' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899

অথবা, ইতিবাচক চেহারা সহ :

$ grep -P '/aa/bbbb/cccccc(?=\s)' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899

অথবা, নেতিবাচক চেহারা সহ :

$ grep -P '/aa/bbbb/cccccc(?!\S)' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899

অথবা আপনি ম্যাচটি বিপরীত করতে পারেন:

$ grep  -v 'c?' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899

অথবা, এমন লাইনের সাথে মেলে যা আপনার প্যাটার্ন ব্যতীত কিছুই থাকে না (কোনও শ্বেত স্পেস নেই):

grep -P '/aa/bbbb/cccccc(\s+|$)' file 
grep -E '/aa/bbbb/cccccc(\s+|$)' file 

অথবা, আপনি কেবল একটি ছোট স্ক্রিপ্ট ব্যবহার করতে পারেন:

  • জোর করে:

    $ awk '$3=="/aa/bbbb/cccccc"' file
    2014-05-05      09:11:53    /aa/bbbb/cccccc             29899
    

    বা, যদি আপনি জানেন না যে কোন ক্ষেত্রটিতে আপনার প্যাটার্ন রয়েছে

    $ awk '{for(i=1;i<=NF;i++){if($i=="/aa/bbbb/cccccc"){print}}}' file
    2014-05-05      09:11:53    /aa/bbbb/cccccc             29899
    
  • পার্লে

    $ perl -ane 'print if grep {$_ eq "/aa/bbbb/cccccc"} @F' file
    2014-05-05      09:11:53    /aa/bbbb/cccccc             29899
    

@ স্টারডন আপনি grep -v 'c?' fileকেন ব্যবহার করবেন না grep -v '?' fileকারণ ফাইলটিতে কেবল দুটি লাইন রয়েছে।
нιηসнιη

@ ক্যাসিয়া সত্য, আমি কেবল কিছুটা নিদর্শন রাখতে চাইছি। আপনি বেশ সঠিক যদিও এই বিশেষ ক্ষেত্রে grep -v '?'যথেষ্ট হবে।
টেরডন

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