ম্যাচ পর্যন্ত সমস্ত ফাইল দেখান


71

grep --before-context 5 ম্যাচের আগে 5 টি লাইন দেখায়।

আমি ম্যাচের আগে সবকিছু দেখাতে চাই।
করা grep --before-context 99999999কাজ করবে কিন্তু এটি খুব বেশি পেশাদার নয়।

ম্যাচ পর্যন্ত সমস্ত ফাইল কীভাবে দেখাবেন?

উত্তর:


95

সেড তার জন্য আরও ভাল।

শুধু কর:

sed '/PATTERN/q' FILE

এটি এর মতো কাজ করে:

প্রতিটি লাইনের জন্য, আমরা এটির সাথে মেলে কিনা তা দেখুন /PATTERN:

  • যদি হ্যাঁ, আমরা এটি মুদ্রণ এবং প্রস্থান
  • অন্যথায়, আমরা এটি মুদ্রণ

এটি সবচেয়ে কার্যকর সমাধান, কারণ এটি দেখার সাথে সাথে PATTERNএটি প্রস্থান করে qu ছাড়া q, সেড বাকী ফাইলটি পড়তে থাকবে এবং এটি দিয়ে কিছুই করবে না। বড় ফাইলগুলির জন্য এটি একটি পার্থক্য করতে পারে।

এই কৌশলটি অনুকরণ করতেও ব্যবহার করা যেতে পারে head:

sed 10q FILE

মাত্র চেষ্টা করা হয়েছে, এটি ফাইলের প্রথম লাইনটি কেবল আউটপুট দেয় ... ম্যাচটি 38
নিকোলাস রাউল

আমার জন্য ভাল কাজ করে। আপনি প্রকৃত ইনপুট এবং আউটপুট একটি উদাহরণ দিতে পারেন? এবং আপনি যে কমান্ডটি চালাচ্ছেন তেমন হয়।
মাইকেল

আপনি এটি সম্পাদনার আগে আমি আপনার আদেশটি চেষ্টা করেছিলাম, এটি ছিল: '' PATTERN / p; q 'ফাইল
নিকোলাস রাউল

7
আমি কী করব, যদি আমি প্যাটার্ন ম্যাচের সাথে লাইনটি মুদ্রণ করতে না চাই?
tommy.carstensen

4
@ tommy.carstensen: ম্যাচ করা sed '/PATTERN/Q' FILEলাইনটি এড়িয়ে যাবে। Qএটি একটি জিএনইউ এক্সটেনশন, সুতরাং এটি কোনও সিডের সাথে কাজ করবে না।
অ্যালেক্স ও

37

sed গ্রেপের বেশিরভাগ কার্যকারিতা প্রতিস্থাপন করতে পারে।

sed -n '1,/<pattern>/ p' <file>

এর অর্থ প্যাটার্নটি মিল না হওয়া পর্যন্ত প্রথম লাইন থেকে মুদ্রণ করা।

পরিসরের উদাহরণ দুটি

sed -n '/<pattern>/,$ p' <file> # from pattern to end of file
sed -n '/<pattern1>/,/<pattern2>/ p' <file> # from pattern1 to pattern2

3
এই আদেশটি ভাল, তবে আপনি আরও ভাল করতে পারেন। এইভাবে এটি পুরো ফাইলটি পড়ে, তবে এটি কোনও মিল খুঁজে পাওয়ার সাথে সাথেই এটি ত্যাগ করা সম্ভব।
মাইকেল

3
আমি কী করব, যদি আমি প্যাটার্ন ম্যাচের সাথে লাইনটি মুদ্রণ করতে না চাই?
tommy.carstensen

34

ম্যাচটি সহ এবং মুদ্রণ করুন:

awk '{print} /pattern/ {exit}' filename
sed '/pattern/q' filename

ম্যাচটি সহ তবে না ছাপুন:

awk '/pattern/ {exit} {print}' filename
sed '/pattern/Q' filename

11
Qএটি দুর্দান্ত তবে gnu নির্দিষ্ট আফাইক, sed -n '/pattern/!p;//q'আরও পোর্টেবল হবে।
don_crissti

@don_crissti: আপনি কি এটিকে একটি উত্তর করা উচিত, আমি মনে করি এটি একটি ভালো (আছে: আমি একটু কৌতুহলী কিভাবে এটি কাজ করে থাকি, যদিও আমি বিশ্বাস করি। !তোলে pলাইন প্রযোজ্য না মিলে pattern, কিন্তু তারপর //qবিভ্রান্ত আমাকে ...
jwd

2
@ ডন_ক্রিসটি: আহ, আমি পেয়েছি - এর //অর্থ "পূর্ববর্তী নিয়মিত প্রকাশ" (আমি ভেবেছিলাম এটি "খালি স্ট্রিংয়ের সাথে মিলে যায়")। আমি মনে করি একই সমাধানের একটি খাটো সংস্করণ: sed -n '/pattern/q;p?
jwd

@jwd - প্রকৃতপক্ষে এটি আরও খাটো that's 👍
don_crissti

1

নিম্নলিখিত বিশুদ্ধ GNU grepপদ্ধতিগুলি কার্যকর নয়।

তিন বার ব্যবহার করে ফাইল বারে " foo " স্ট্রিংয়ের প্রথম উদাহরণ পর্যন্ত সমস্ত কিছুর সন্ধান করুন :grep

grep -m 1 -B $(grep -n -m 1 foo bar | grep -o '^[0-9]*') foo bar

" Foo " এর শেষ উদাহরণটির সাথে মিলছে :

grep -oPz "(?s)[^\n]*${s}.*?\n.*?foo.*?\n" bar

দ্রষ্টব্য: সর্বশেষে বিশদগুলি grepপাওয়া যাবে: মাল্টি-লাইন অনুসন্ধানের জন্য রেজেেক্স (গ্রেপ)


grepকেবল যখনই একটি একক দাওয়াত চালানোর বিষয় হয় তখন কেন কেউ 7 টি (+ পিসি) ব্যবহার করতে চান sed: sed 'x;/./G;//!x;/foo/p;//s/.*//;x;d'??
don_crissti

@ ডন_ক্রিসটি, আপনার কোডটির sedনিজস্ব উত্তরের মূল্য রয়েছে বলে মনে হচ্ছে বা অন্য কোনওটির সাথে যোগ করা যেতে পারে। পুনরায় 7 grepটি: কারণ কোনও grepউত্তর ছিল না ... (প্লাস, উত্তরটি কেন না তা দেখায়
helps

এটি আমার কোড নয়, কেবল এটিতে ক্লিক করুন ... এমনকি যদি এটি আমার কোড ছিল তবে এটি এখানে প্রশ্নটির উত্তর দেয় না তাই আমি এটি উত্তর হিসাবে পোস্ট করব না।
don_crissti

1

উপরে মাইকেলের উত্তর যুক্ত করা হচ্ছে ...


সব লাইন মুদ্রণ করতে আপ, কিন্তু না সহ , প্রথম লাইনে FILEধারণকারী PATTERN, চেষ্টা করে দেখুন:

  • sed '/.*PATTERN.*/{s///;q;}' FILE

এটি প্যাটার্নযুক্ত পুরো লাইনের সাথে মেলে, এটিকে একটি ফাঁকা রেখার সাথে প্রতিস্থাপন করে, তারপরে বাকী ফাইলটি প্রক্রিয়াজাত না করেই প্রস্থান করে।


পোস্ট-স্ক্রিপ্ট:

শেষে অতিরিক্ত নিউলাইন মুদ্রণ রোধ করার সবচেয়ে সহজ / পরিষ্কার উপায়টি (অন্য কোনও সরঞ্জামের সাথে জড়িত না করে) পুনরায় চালনা এবং নতুন চূড়ান্ত লাইনটি মুছে ফেলা ছিল:

sed '/.*PATTERN.*/{s///;q;}' FILE | sed '$d'

... এবং যেহেতু আমরা এখন যেভাবেই লাইনটি মোছা করছি, আমাদের পূর্ববর্তী কাজগুলি নিরর্থক এবং আমরা এতে সহজতর করতে পারি:

sed '/PATTERN/q' FILE | sed '$d'

গ্লেনের উত্তর - এবং আমার মন্তব্য - এটি একটি একক sedঅনুরোধের মাধ্যমে কীভাবে করা যায় তা দেখান ।
don_crissti

(এর জন্য ধন্যবাদ - আমি এ.সি.সি. এর উত্তরে আপনার মন্তব্য দেখেছি তবে তা অন্য একটিটি মিস করেছে বা এটি এড়িয়ে গেছে কারণ আমার মস্তিষ্ক দ্বৈত-নেতিবাচক পছন্দ করে না।) যেহেতু আমি এটিকে একটি tcshএবং একটি bashউপন্যাস উভয় ক্ষেত্রেই ব্যবহার করছিলাম, তাই আমার নিশ্চিত হওয়া দরকার একটি অপেক্ষাকৃত সংক্ষিপ্ত এক-লাইন সমাধান ছিল যা স্ট্যান্ডার্ড এবং জিএনইউ sed(পোর্টেবিলিটির জন্য) উভয় ক্ষেত্রেই কাজ করে ; আপনার অবদান খুব ভাল পূরণ করতে পারে যে সমস্ত প্রয়োজনীয়তা। যে কেউ sed খুব কম ব্যবহার করে , আমার সবচেয়ে গুরুত্বপূর্ণ প্রয়োজনটি এমন কিছুটির জন্য ছিল যা আমি এখন থেকে কয়েক বছর আগে সম্পাদনা করতে বা পুনরায় উদ্দেশ্য করতে চাইলে দ্রুত বুঝতে পারি।
জিম গ্রিশাম

1

প্রতিদিন কাজের জন্য কেবলমাত্র মৌলিক সরঞ্জামগুলি মনে রাখতে এবং কম মার্জিত এবং কম দক্ষ সমাধান গ্রহণ করতে ইচ্ছুক ব্যক্তিদের জন্য:

head -n $(grep -n pattern filename | cut -d: -f1) filename

যদি এই আদেশটি কোনও স্ক্রিপ্টের জন্য হয় তবে আমি আরও মার্জিত (এবং সম্ভবত দক্ষ) সমাধানগুলি সন্ধান করব। এটি যদি ওয়ান টাইম কমান্ড বা একটি থ্রো অ্যাওর স্ক্রিপ্ট হয় তবে আমার পাত্তা নেই।


1
ভাল ধারণা, কিন্তু তিনটি কমান্ড যখন কেউ এটি করবে।
মাইকেল

1
বুনিয়াদি জানা সত্যিই খুব ভাল। কাজের জন্য সঠিক সরঞ্জাম জানা ভাল, যদিও।
15

যদি এই আদেশটি কোনও স্ক্রিপ্টের জন্য হয় তবে আমি আরও মার্জিত (এবং সম্ভবত দক্ষ) সমাধানগুলি সন্ধান করব। যদি এটি ওয়ান টাইম কমান্ড (বা একটি স্ক্রোক দূরে স্ক্রিপ্ট) হয়, তবে আমি পাত্তা দিই না।
লেসমানা

0

আপনি নিম্নলিখিতগুলির মধ্যে একটি ব্যবহার করতে পারেন

tac ./test | grep -B $(cat ./test | wc -l) -m 1 'pattern'|tac 

অথবা

tac ./test |head -n $(tac ./test | grep -n 'pattern' | cut -d: -f1 | head -n 1)|tac

অথবা

tac ./test |sed ':a;N;$!ba;s/\n/'"pattern"'/g' | sed 's/'"patternpattern"'/\n/g'|head -n 1|sed 's/'"pattern"'/\n/g'|tac

প্রথম বিকল্পটি ওপি যা বলেছিল তার ঠিক অনুরূপ, এটি ফাইলের লাইনগুলি গণনা করে প্রসঙ্গের আগে টিআই যথেষ্ট লাইন প্রদর্শন নিশ্চিত করে

দ্বিতীয় বিকল্পটি প্রথম ম্যাচের লাইন নম্বর অনুসন্ধান করে (আপনি অভ্যন্তরীণ 'মাথা' পরিবর্তন করে এটিও পরিবর্তন করতে পারেন) এবং সেই সংখ্যার শীর্ষের চেয়ে

শেষ বিকল্পটি ম্যাচের সাথে সমস্ত নতুন রেখাকে প্রতিস্থাপন করে এবং দুটি সংলগ্ন ম্যাচের পরিবর্তে একটি নতুন লাইনের পরিবর্তে। এর আউটপুট হ'ল দুটি ম্যাচের মধ্যবর্তী পাঠ্যের প্রতিটি ব্লকের জন্য একটি লাইন। এর পরে এটি প্রথম লাইনটি (প্রথম ম্যাচ অবধি পাঠ্যের ব্লককে ছাঁটাই করা) ম্যাচটি বেছে নেওয়ার জন্য এবং প্রতিটি ম্যাচকে একটি নতুন লাইনে পুনরায় স্থানান্তরিত করার জন্য 'হেড' ব্যবহার করে। এই বিকল্পটি কেবলমাত্র ফাইলটি নিম্নলিখিত ফর্ম্যাটে থাকলে কাজ করে

pattern
texttexttext
texttexttext texttexttext
texttexttexttexttexttexttexttexttext
pattern
texttexttext
pattern 
texttexttext
texttexttexttexttexttexttexttexttext

এবং তাই এগিয়ে


2
কীভাবে এই কাজগুলি ব্যাখ্যা করার বিষয়ে বিবেচনা করুন, বিশেষত কারণ sedনীচে যে কমান্ডটি উদাররূপে।
strugee

প্রথম বিকল্পটি ওপি যা বলেছিল তার ঠিক অনুরূপ, ফিলারের লাইনগুলি গণনা করে প্রসঙ্গের আগে টিআই যথেষ্ট কাইগুলি দেখায় তা নিশ্চিত করে
ইউজার 122778
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.