গ্রেপ আউটপুটকে স্বল্প লাইনে সীমাবদ্ধ করুন


8

আমি প্রায়শই এই জাতীয় নির্দিষ্ট এন্ট্রিযুক্ত ফাইলগুলি খুঁজতে গ্রেপ ব্যবহার করি:

grep -R 'MyClassName'

ভাল জিনিস হ'ল এটি ফাইলগুলি, তাদের বিষয়বস্তুগুলি ফেরত দেয় এবং লাল রঙের মধ্যে পাওয়া স্ট্রিংটিকে চিহ্নিত করে। খারাপ জিনিসটি হ'ল আমার কাছে বিশাল ফাইলও রয়েছে যেখানে পুরো টেক্সটটি একটি বড় একক লাইনে লেখা থাকে। এই বড় ফাইলগুলির মধ্যে পাঠ্য সন্ধানের সময় এখন গ্রেপ আউটপুটগুলি খুব বেশি। বাম এবং ডানদিকে উদাহরণস্বরূপ 5 টি শব্দকে আউটপুট সীমাবদ্ধ করার কোনও উপায় আছে কি? বা হতে পারে 30 টি অক্ষরের বাম এবং ডানদিকে আউটপুট সীমাবদ্ধ?


3
আপনার ফলাফলগুলি পাইপ করুনcut
রিঞ্জউইন্ড

সুতরাং, আসুন আমরা যে প্যাটার্নটির সন্ধান করছেন তা 50 এর অবস্থানের কথা বলুন, তবে আপনি বলেছিলেন যে আপনি কেবল 30 টি অক্ষর চান then আপনি তখন কী করতে চান? সেই লাইনটি উপেক্ষা করুন বা এটিকে আউটপুটতে অন্তর্ভুক্ত করুন তবে এটি ছাঁটাবেন? আপনি ঠিক কী সীমাবদ্ধ করতে চান - অনুসন্ধান বা নিজেরাই লাইনগুলি?
সের্গেই কোলোডিয়াজনি

1
@ রিনজুইন্ড আপনি কী অর্জন করতে চান তা আমি পুরোপুরি বুঝতে পারি না cut, কারণ এটি কেবল সীমানা বা অক্ষরের সংখ্যা দ্বারা বিভক্ত হয়। যদিও আমি যখন MyClassNameএটির সাথে একটি লাইন পাই তখন লাইনটি যে কোনও জায়গায় থাকতে পারে এবং সর্বদা একই অবস্থানে থাকে না। তদ্ব্যতীত, এর সামনের এবং এর পিছনে অক্ষরের বিভিন্নতা থাকতে পারে, যা ডিলিমিটার দ্বারা বিভক্ত হওয়ার সম্ভাবনাটি ভেঙে দেয়।
সক্রেটিস

1
@ সার্জিকোলডিএজনি যখন একটি ইতিবাচক লাইনটি MyClassNameপাওয়া যায়, তখন আমি ফলস্বরূপ ফাইলের নাম এবং এক্স অক্ষরগুলি বাম এবং ডান পেতে চাই। x হ'ল আমি যে কোনও নম্বর সরবরাহ করি, উদাহরণস্বরূপ 30. ফাইলের অন্যান্য বিষয়বস্তু উপেক্ষা করা হবে। এটি ম্যাচের ফাইলগুলিতে একটি প্রসঙ্গ পেতে এবং ওভারলোডকে সীমাবদ্ধ করা হয়।
সক্রেটিস

1
@Rinzwind কাস্টম বিভেদক কি ধরনের আপনার সাথে সুপারিশ করবে cutযদি নিম্নলিখিত ইনপুট দিয়ে তিনটি ফাইল আছে: oiadfaosuoianavMyClassNameionaernaldfajdএবং /(/&%%§%/(§(/MyClassName&((/$/$/(§/$&এবং public class MyClassName { public static void main(String[] args) { } }?
সক্রেটিস

উত্তর:


15

grepকেবলমাত্র রেখার উপর ভিত্তি করে প্রসঙ্গের জন্য বিকল্প রয়েছে। একটি বিকল্প এই এসই পোস্ট দ্বারা প্রস্তাবিত :

একটি কার্যপ্রণালী হ'ল বিকল্পটি কেবল 'মিলছে' সক্রিয় করা এবং তারপরে আপনার পাঠ্যের চেয়ে কিছুটা আরও গ্রেপ করার জন্য RegExp এর শক্তি ব্যবহার করা:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}" ./filepath

অবশ্যই, যদি আপনি রঙ হাইলাইটিং ব্যবহার করেন তবে আপনি কেবলমাত্র সত্যিকারের ম্যাচটি রঙিন করতে আবার গ্রেপ করতে পারেন:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}"  ./filepath | grep "WHAT_I_M_SEARCHING"

অন্য বিকল্প হিসাবে, আমি foldপাঠ্যটি যুক্ত করে তারপরে গ্রিপিংয়ের পরামর্শ দেব, উদাহরণস্বরূপ:

fold -sw 80 input.txt | grep ...

-sবিকল্প করতে হবে foldমধ্যবর্তী ভঙ্গ পরিবর্তে পরবর্তী লাইনে ধাক্কা শব্দ।

অথবা আপনার ইনপুটটির কাঠামোর ভিত্তিতে লাইনগুলিতে ইনপুট বিভক্ত করতে অন্য কোনও উপায় ব্যবহার করুন। (উদাহরণস্বরূপ, এসইউ পোস্টটি জেএসএনের সাথে কাজ করেছে, তাই jqসুন্দর প্রিন্টে ইত্যাদি ব্যবহার করে এবং grep... বা কেবল jqনিজের দ্বারা ফিল্টারিং করতে ব্যবহার করা ... উপরের দুটি বিকল্পের মধ্যে যে কোনওটির চেয়ে ভাল হবে))


এই জিএনইউ অ্যাংক পদ্ধতিটি দ্রুত হতে পারে:

gawk -v n=50 -v RS='MyClassName' '
  FNR > 1 { printf "%s: %s\n",FILENAME, p prt substr($0, 0, n)}
  {p = substr($0, length - n); prt = RT}
' input.txt
  • আমাদের ( -v RS=...) আগ্রহী সেই প্যাটার্নে রেকর্ডগুলি বিভক্ত করতে ও ডেকে বলুন , এবং প্রসঙ্গে বর্ণগুলির সংখ্যা ( -v n=...)
  • প্রথম রেকর্ডের পরে প্রতিটি রেকর্ড ( FNR > 1) এর মধ্যে এমন একটি জায়গা যেখানে সন্ত্রস্ত প্যাটার্নটির জন্য একটি মিল খুঁজে পেয়েছিল।
  • সুতরাং আমরা nপূর্ববর্তী লাইনের ( p) থেকে পূর্ববর্তী nঅক্ষর এবং বর্তমান লাইন থেকে শীর্ষস্থানীয় অক্ষর ( substr($0, 0, n)) পূর্ববর্তী লাইনের (যা prt)
    • আমরা সেট করি pএবং মুদ্রণের prt পরে , সুতরাং আমরা যে মানটি সেট করি তা পরবর্তী পংক্তির দ্বারা ব্যবহৃত হয়
    • RT এটি একটি জিএনইউজম, এজন্যেই এটি জিএনইউ বিশ্রী-নির্দিষ্ট।

পুনরাবৃত্ত অনুসন্ধানের জন্য, সম্ভবত:

find . -type f -exec gawk -v n=50 -v RS='MyClassName' 'FNR>1{printf "%s: %s\n",FILENAME, p prt substr($0, 0, n)} {p = substr($0, length-n); prt = RT}' {} +

2
ঠিক আছে, এটি কাজ করে। দেখে মনে হচ্ছে রেইজেক্স একটি বৈধ পন্থা, সুতরাং এর জন্য ধন্যবাদ। প্রসেসিং সময় যদিও বেশ বড়। আমার উপরের পোস্টে যেমন রেগেক্স ছাড়া এটি 4.912 সেকেন্ড হয় এবং রেগেক্সের সাথে আপনার পোস্টে এটি 3 মি 39.312 লাগে।
সক্রেটিস

1
@ সক্রেটিস দেখুন যে আমি উপরে যুক্ত করা অ্যাডাব্লিক পদ্ধতিটি আরও ভাল সম্পাদন করে
মুরু

1
foldপদ্ধতিটি কেবল তখনই ব্যবহার করা যেতে পারে আপনি যদি নিশ্চিত হন যে সন্ধানের স্ট্রিংটি সীমান্তে উপস্থিত হবে না, অন্যথায় এটি লুকিয়ে থাকবে grep
মেলিবিয়াস

1
@ মুরু আপনার সাথে পরামর্শের জন্য ধন্যবাদ gawk। দুর্ভাগ্যক্রমে, প্রস্তাবিত কমান্ড findআউটপুটগুলি এলোমেলো স্টাফ এবং কোনও ফাইলের নাম নেই, যখন আমার সিস্টেমে কার্যকর করা হয়। তদুপরি, awkকমান্ডটি সঠিকভাবে বিশ্লেষণ করতে আমি যথেষ্ট সাবলীল নই । বর্তমানে, রিজেক্সের সাথে সংমিশ্রণটি grepবিষয়টি দ্রুত না হলেও নির্ভরযোগ্য। আবার, অনেক ধন্যবাদ।
সক্রেটিস

1
@ সক্রেটিস আমি মনে করি আমি awk কমান্ডটি ঠিক করেছিলাম। আমার মানসিক মডেলটি কোন লাইনের RTএবং উপসর্গ ইত্যাদি ব্যবহার করা উচিত সে সম্পর্কে ভুল ছিল ।
মুড়ু

1

কিছু অন্যান্য বিকল্পের সাথে একচেটিয়াভাবে ম্যাচিং ব্যবহার করা (নীচে দেখুন), অন্য উত্তরে বর্ণিত রেজেক্সের ওভারহেড প্রসেসিং ছাড়াই আপনি যা খুঁজছেন তার খুব কাছাকাছি হতে পারে

grep -RnHo 'MyClassName'
  • n সংখ্যাগত আউটপুট, ম্যাচের লাইন নম্বরটি দেখান
  • এইচ ফাইলের নাম, ম্যাচের লাইনের শুরুতে ফাইলের নামটি প্রদর্শন করুন
  • o কেবল মিলছে, কেবল ম্যাথড স্ট্রিং দেখায়, পুরো লাইনটি নয়

যদিও এটি সত্য যে ফলাফলটি খুব দ্রুত পাওয়া গেছে, সেখানে তথ্য নেই। ফাইলের পথটি দেখানো হয়েছে, লাইন নম্বরটি দেখানো হয়েছে তবে পাঠ্য আউটপুটটি কেবল আমার প্রাথমিক অনুসন্ধান MyClassName। সুতরাং, প্রসঙ্গটি অনুপস্থিত।
সক্রেটিস

grep -RnHo "MyClassName"এবং grep -Rno "MyClassName"একই আউটপুট আছে।
সক্রেটিস

@ একই ডিরেক্টরিতে এইচ ছাড়া সোসাইটিস আউটপুট একরকম নয়
রবার্ট রিডেল

-oযদি Regex কিছু পরিবর্তনশীল অংশ ছিল পতাকা আকর্ষণীয় হতে পারে। একটি নির্দিষ্ট স্ট্রিংয়ের জন্য, এটি প্রতিবার মুদ্রণ করা অকেজো। ওপি সম্ভবত নিকটবর্তী প্রসঙ্গে আগ্রহী।
মেলিবিয়াস

1
@ সোক্রেটস, সত্য - প্রসঙ্গটি অনুপস্থিত, তবে আমি ভেবেছিলাম এটিই মূল বিষয়? আউটপুট সীমাবদ্ধ? আপনি ( -B 1) আগে বা পরে লাইনগুলি যোগ করে আবার প্রসঙ্গ যুক্ত করতে পারেন -A 1। দুঃখিত যে আমি আরও সাহায্য করতে পারে না।
রবার্ট রিডেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.