নিয়মিত অভিব্যক্তির সাথে মিলিত প্রথম লাইনের পরে কোনও ফাইলের অংশ কীভাবে পাবেন?


169

আমার কাছে প্রায় 1000 লাইনযুক্ত একটি ফাইল রয়েছে। আমি লাইন পরে আমার ফাইলের অংশটি চাই যা আমার গ্রেপ স্টেটমেন্টের সাথে মেলে।

এটাই:

$ cat file | grep 'TERMINATE'     # It is found on line 534

সুতরাং, আমি আরও প্রক্রিয়াকরণের জন্য ফাইলটি 535 লাইন থেকে 1000 লাইনে চাই।

আমি এটা কিভাবে করবো?


34
ইউইউওসি (বিড়ালের অকেজো ব্যবহার):grep 'TERMINATE' file
জ্যাকব

30
আমি জানি যে এটি এর মতো আমি এটি সেভাবেই ব্যবহার করি। প্রশ্নে ফিরে আসা যাক।
যুগাল জিন্ডল

3
এটি একটি পুরোপুরি সূক্ষ্ম প্রোগ্রামিং প্রশ্ন, এবং স্ট্যাকওভারফ্লোয়ের জন্য বেশ উপযুক্ত।
আইয়ুব

13
@ জ্যাকব এটি বিড়ালের ব্যবহার একেবারেই অকেজো নয়। এর ব্যবহারের যার মানে আমরা ব্যবহার করতে পারি মান আউটপুট করার জন্য একটি ফাইল, মুদ্রণ করতে হয় grepগুলি বরং তা জানতে প্রয়োগ করতে সুইচ থাকার চেয়ে ডাটা পড়তে, মানক ইনপুট ইন্টারফেস grep, এবং sed, এবং awk, এবং pandoc, এবং ffmpegইত্যাদি যখন আমরা পড়তে চাই একটি ফাইল থেকে। এটি সময় সাশ্রয় করে কারণ প্রতিবার আমরা একই জিনিসটি করতে চাইলে নতুন সুইচ শিখতে হবে না: একটি ফাইল থেকে পড়ুন।
রানেক

@runeks আমি তোমার অনুভূতির সঙ্গে একমত - কিন্তু আপনি বিড়াল ছাড়া অর্জন করতে পারেন: grep 'TERMINATE' < file। সম্ভবত এটি পড়া কিছুটা শক্ত করে তোলে - তবে এটি শেল স্ক্রিপ্টিং, তাই এটি সর্বদা একটি সমস্যা হতে চলেছে :)
LOAS

উত্তর:


307

নিম্নলিখিতটি TERMINATEফাইলের শেষ অবধি লাইনের সাথে মিলে মুদ্রণ করবে :

sed -n -e '/TERMINATE/,$p'

বর্ণিত: এতে প্রতিটি স্ক্রিপ্টের স্ক্রিপ্ট কার্যকর করার পরে মুদ্রণের -nডিফল্ট আচরণটি অক্ষম sedকরে, এতে -eএকটি স্ক্রিপ্ট নির্দেশ করে sed, /TERMINATE/,$একটি ঠিকানা (লাইন) পরিসীমা নির্বাচন মানে TERMINATEফাইলের শেষের দিকে নিয়মিত এক্সপ্রেশন (গ্রেপের মতো) এর সাথে প্রথম লাইনের সাথে মিল থাকে ( $) , এবং pএটি মুদ্রণ কমান্ড যা বর্তমান লাইনটি প্রিন্ট করে।

এটি TERMINATEফাইলের শেষ অবধি লাইনটি মিলে যাওয়া লাইনটি থেকে মুদ্রণ করবে :
(ম্যাচিং লাইনটি ইওএফের পরে, ম্যাচিং লাইন সহ নয়)

sed -e '1,/TERMINATE/d'

বর্ণিত: 1,/TERMINATE/ একটি ঠিকানা (লাইন) রেঞ্জ নির্বাচন যা TERMINATEনিয়মিত অভিব্যক্তির সাথে মিল থাকা প্রথম লাইনটির জন্য ইনপুটটির জন্য প্রথম লাইন এবং dমুছে ফেলা কমান্ড যা বর্তমান লাইনটি মুছে ফেলে এবং পরবর্তী লাইনে চলে যায়। sedডিফল্ট আচরণটি লাইনগুলি মুদ্রণ করা হিসাবে এটি TERMINATE ইনপুট শেষ হওয়ার পরে লাইনগুলি মুদ্রণ করবে ।

সম্পাদনা:

আপনি যদি আগে লাইনগুলি চান TERMINATE:

sed -e '/TERMINATE/,$d'

এবং যদি আপনি TERMINATEএকক পাসে 2 টি ভিন্ন ফাইলের আগে এবং পরে উভয় লাইন চান :

sed -e '1,/TERMINATE/w before
/TERMINATE/,$w after' file

ফাইলগুলির আগে এবং পরে সমাপ্তির সাথে লাইন থাকবে, সুতরাং আপনার প্রতিটি ব্যবহারের প্রয়োজন হয় যাতে প্রক্রিয়া করার জন্য:

head -n -1 before
tail -n +2 after

Edit2:

যদি আপনি সেড স্ক্রিপ্টে ফাইলের নামগুলি হার্ড-কোড করতে না চান তবে আপনি এটি করতে পারেন:

before=before.txt
after=after.txt
sed -e "1,/TERMINATE/w $before
/TERMINATE/,\$w $after" file

তবে আপনাকে $শেষ পংক্তির অর্থটি এড়াতে হবে যাতে শেলটি $wভেরিয়েবলটি প্রসারিত করার চেষ্টা করবে না (লক্ষ্য করুন যে আমরা এখন একক উদ্ধৃতিগুলির পরিবর্তে স্ক্রিপ্টের চারদিকে ডাবল উদ্ধৃতি ব্যবহার করি)।

আমি বলতে ভুলে গেছি যে স্ক্রিপ্টের ফাইলনামগুলির পরে নতুন লাইনটি গুরুত্বপূর্ণ, যাতে সেড ফাইল ফাইলের নাম শেষ করে তা জানতে পারে।


সম্পাদনা করুন: 2016-0530

সাবাস্তিয়ান ক্ল্যামেন্ট জিজ্ঞাসা করেছিল: "আপনি কীভাবে TERMINATEএকটি ভেরিয়েবল দ্বারা হার্ডকোডযুক্ত প্রতিস্থাপন করবেন ?"

আপনি মিলে যাওয়া পাঠ্যের জন্য একটি পরিবর্তনশীল তৈরি করতে এবং তারপরে এটি পূর্ববর্তী উদাহরণের মতো করুন:

matchtext=TERMINATE
before=before.txt
after=after.txt
sed -e "1,/$matchtext/w $before
/$matchtext/,\$w $after" file

পূর্ববর্তী উদাহরণগুলির সাথে মেলে পাঠ্যের জন্য একটি ভেরিয়েবল ব্যবহার করতে:

## Print the line containing the matching text, till the end of the file:
## (from the matching line to EOF, including the matching line)
matchtext=TERMINATE
sed -n -e "/$matchtext/,\$p"
## Print from the line that follows the line containing the 
## matching text, till the end of the file:
## (from AFTER the matching line to EOF, NOT including the matching line)
matchtext=TERMINATE
sed -e "1,/$matchtext/d"
## Print all the lines before the line containing the matching text:
## (from line-1 to BEFORE the matching line, NOT including the matching line)
matchtext=TERMINATE
sed -e "/$matchtext/,\$d"

এই ক্ষেত্রে ভেরিয়েবলের সাথে পাঠ্য প্রতিস্থাপন সম্পর্কে গুরুত্বপূর্ণ পয়েন্টগুলি হ'ল:

  1. ভেরিয়েবলগুলি ( $variablename) দ্বারা আবদ্ধ single quotes[ '] "প্রসারিত" হবে না তবে ভেরিয়েবলের ভিতরে double quotes[ "] হবে। সুতরাং, আপনি যদি কোনও ভেরিয়েবলের সাথে প্রতিস্থাপন করতে চান তবে সেগুলিতে single quotesআপনাকে সমস্ত পরিবর্তন করতে হবে double quotes
  2. sedরেঞ্জ একটি ধারণ $এবং অবিলম্বে মত একটি চিঠি দ্বারা অনুসরণ করা হয়: $p, $d, $w। তারা ভেরিয়েবল দেখতে কেমন হবে প্রসারিত করা, তাই আপনি ঐ অব্যাহতি আছে $একটি ব্যাকস্ল্যাশ [দিয়ে অক্ষর \] পছন্দ করে: \$p, \$d, \$w

আমরা কীভাবে TERMINATE এর আগে লাইনগুলি পেতে পারি এবং এরপরে সমস্তগুলি মুছতে পারি?
যুগাল জিন্ডল

আপনার পরিবর্তনশীল দ্বারা হার্ডকডযুক্ত টার্মিনালটি কীভাবে প্রতিস্থাপন করা হবে?
সেবাস্টিয়ান Clément

2
এখানে একটি ব্যবহারের বিষয়টি অনুপস্থিত যা হ'ল শেষ চিহ্নিতকারীটির পরে কীভাবে লাইনগুলি প্রিন্ট করা যায় (যদি ফাইলটিতে তাদের একাধিক থাকতে পারে .. লগ ফাইলগুলি ভাবেন ইত্যাদি)।
মাটো

উদাহরণটি প্রথম লাইনে ঘটে sed -e "1,/$matchtext/d"যখন কাজ করে না $matchtext। আমাকে এটিতে পরিবর্তন করতে হয়েছিল sed -e "0,/$matchtext/d"
করালগা

61

একটি সাধারণ অনুমান হিসাবে আপনি ব্যবহার করতে পারেন

grep -A100000 TERMINATE file

যা গ্রেপ করে TERMINATEএবং সেই লাইনটি অনুসরণ করে 100000 লাইন পর্যন্ত আউটপুট দেয়।

ম্যান পৃষ্ঠা থেকে

-A NUM, --after-context=NUM

মেলানো লাইনের পরে চলমান প্রসঙ্গের NUM টি লাইন মুদ্রণ করুন। ম্যাচের সংলগ্ন গ্রুপগুলির মধ্যে একটি গ্রুপ বিভাজক (-) ধারণকারী একটি লাইন স্থাপন করে। -ও বা - একমাত্র-মিলের বিকল্পের সাথে, এর কোনও প্রভাব নেই এবং একটি সতর্কতা দেওয়া হয়।


এটি এর জন্য কাজ করতে পারে তবে অনেক ফাইল প্রক্রিয়া করার জন্য আমার স্ক্রিপ্টে এটি কোড করা দরকার। সুতরাং, কিছু জেনেরিক সমাধান দেখান।
যুগাল জিন্ডল

3
আমি মনে করি এটি একটি ব্যবহারিক সমাধান!
মিশেলগোটা

2
একইভাবে-বি NUM, - পূর্ব-প্রসঙ্গ = NUM ​​টি লাইন মিলার আগে নেতৃস্থানীয় প্রসঙ্গের NUM টি লাইন মুদ্রণ করুন। ম্যাচের সংলগ্ন গ্রুপগুলির মধ্যে একটি গ্রুপ বিভাজক (-) ধারণকারী একটি লাইন স্থাপন করে। -ও বা - একমাত্র-মিলের বিকল্পের সাথে, এর কোনও প্রভাব নেই এবং একটি সতর্কতা দেওয়া হয়।
পিয়ুসজি

এই সমাধানটি আমার পক্ষে কাজ করেছে কারণ আমি পরীক্ষা করতে আমার স্ট্রিং হিসাবে ভেরিয়েবলগুলি সহজেই ব্যবহার করতে পারি।
জোসে মার্টিনেজ

3
চমৎকার ধারণা! আপনি যদি প্রসঙ্গের আকার সম্পর্কে অনিশ্চিত হন তবে আপনি তার পরিবর্তনের লাইনগুলি গণনা করতে পারেন file:grep -A$(cat file | wc -l) TERMINATE file
লেমিং

26

এখানে ব্যবহার করার জন্য একটি সরঞ্জাম অদৃশ্য:

cat file | awk 'BEGIN{ found=0} /TERMINATE/{found=1}  {if (found) print }'

কিভাবে কাজ করে:

  1. আমরা ভেরিয়েবলটি 'পাওয়া' শূন্যে সেট করেছিলাম, মিথ্যা মূল্যায়ন করে
  2. যদি নিয়মিত প্রকাশের সাথে 'TERMINATE' এর জন্য কোনও মিল পাওয়া যায়, আমরা এটি সেট করে রাখি।
  3. যদি আমাদের 'পাওয়া' ভেরিয়েবলটি সত্যের কাছে মূল্যায়ন করে তবে মুদ্রণ করুন :)

আপনি যদি খুব বড় ফাইলগুলিতে ব্যবহার করেন তবে অন্যান্য সমাধানগুলি প্রচুর স্মৃতি গ্রহণ করতে পারে।


সরল, মার্জিত এবং খুব সাধারণ ic আমার ক্ষেত্রে এটি '###' এর দ্বিতীয় ঘটনার আগ পর্যন্ত সবকিছু মুদ্রণ করছিল:cat file | awk 'BEGIN{ found=0} /###/{found=found+1} {if (found<2) print }'
আলেকসান্দার স্টেলম্যাকজোনেক

3
একটি টুল না এখানে ব্যবহার করা catawkএক বা একাধিক ফাইলের নাম আর্গুমেন্ট হিসাবে গ্রহণে পুরোপুরি সক্ষম। আরও দেখুন stackoverflow.com/questions/11710552/useless-use-of-cat
tripleee

9

যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে আপনি লাইনটি পরে চাইলে TERMINATEনা, TERMINATEলাইনটিও অন্তর্ভুক্ত করবেন না । awkএটি একটি সহজ উপায়ে করতে পারেন:

awk '{if(found) print} /TERMINATE/{found=1}' your_file

ব্যাখ্যা:

  1. সর্বোত্তম অনুশীলন না হলেও আপনি এই সত্যের উপর নির্ভর করতে পারেন যে সমস্ত ভার্সটি 0 এ ডিফল্ট হয় বা খালি স্ট্রিং সংজ্ঞায়িত না হলে। সুতরাং প্রথম প্রকাশটি ( if(found) print) শুরু করার সাথে সাথে কোনও মুদ্রণ করবে না।
  2. মুদ্রণটি শেষ হওয়ার পরে আমরা এটি স্টার্টার-লাইন কিনা তা পরীক্ষা করে দেখি (এটি অন্তর্ভুক্ত করা উচিত নয়)।

এই সব লাইন প্রিন্ট হবে পরেTERMINATE লাইন।


সাধারণীকরণ:

  • আপনার সাথে একটি ফাইল আছে শুরু - এবং শেষ -lines এবং আপনাকে সেই লাইনের মধ্যে লাইন চান ব্যতীত শুরু - এবং শেষ -lines।
  • শুরু - এবং শেষ- লাইনগুলি লাইনটির সাথে মিলে যাওয়া একটি নিয়মিত প্রকাশ দ্বারা সংজ্ঞায়িত করা যেতে পারে।

উদাহরণ:

$ cat ex_file.txt 
not this line
second line
START
A good line to include
And this line
Yep
END
Nope more
...
never ever
$ awk '/END/{found=0} {if(found) print} /START/{found=1}' ex_file.txt 
A good line to include
And this line
Yep
$

ব্যাখ্যা:

  1. যদি শেষ লাইন পাওয়া যায় কোন মুদ্রণ সম্পন্ন করতে হবে। নোট করুন যে ফলাফলটি থেকে শেষ- লাইনটি বাদ দিতে প্রকৃত মুদ্রণের আগে এই চেকটি করা হয়েছে ।
  2. বর্তমান লাইনটি foundসেট করা থাকলে মুদ্রণ করুন ।
  3. তাহলে শুরু লাইন তারপর পাওয়া সেট করা হয় found=1, যাতে নিম্নলিখিত পংক্তিগুলি ছাপা হয়। নোট করুন যে ফলাফলটি থেকে প্রারম্ভকালীনটি বাদ দিতে প্রকৃত মুদ্রণের পরে এই চেকটি করা হয় ।

মন্তব্য:

  • কোডটি এই সিদ্ধান্তে নির্ভর করে যে সমস্ত awk-vars ডিফল্ট 0 বা খালি স্ট্রিং সংজ্ঞায়িত না হলে। এটি বৈধ তবে সর্বোত্তম অনুশীলন নাও হতে পারে তাই আপনি BEGIN{found=0}অ্যাডাক-এক্সপ্রেশনটির শুরুতে যোগ করতে পারেন ।
  • যদি একাধিক স্টার্ট-এন্ড- ব্লকগুলি পাওয়া যায় তবে সেগুলি সমস্ত মুদ্রিত।

1
আশ্চর্যজনক দুর্দান্ত উদাহরণ। মাত্র ২ ঘন্টা সিএসপি্লিট, সেড এবং জটিল স্ট্রাক্ট কমান্ডের সমস্ত ধরণের দিকে তাকিয়ে। আমি যা চাইছিলাম তা কেবল এটিই করেনি তবে এটির সাথে সম্পর্কিত অন্যান্য প্রয়োজনীয় জিনিসগুলি কীভাবে এটি পরিবর্তন করতে হবে তা নির্ধারণ করার জন্য যথেষ্ট সহজ দেখায়। আমাকে স্মরণ করিয়ে দেয় যে কর্কশ খুব দুর্দান্ত এবং কেবল ছাঁটাইয়ের অনিবার্য জগতে নয়। ধন্যবাদ।
ব্যবহারকারী 1169420

{if(found) print}অ্যাজকের কিছুটা অ্যান্টি-প্যাটার্ন, ব্লকটি কেবলমাত্র দিয়ে প্রতিস্থাপন করা foundবা found;পরে যদি আপনার অন্য কোনও ফিল্টারের প্রয়োজন হয় তবে এটি আরও মূর্তিমান ।
ব্যবহারকারী000001

@ ব্যবহারকারী000001 দয়া করে ব্যাখ্যা করুন। কোনটা প্রতিস্থাপন করব এবং কীভাবে করব বুঝতে পারছি না। যাইহোক আমি মনে করি এর লিখিতভাবে যা চলছে তা এটি খুব পরিষ্কার করে দেয়।
উলফআর

1
আপনি প্রতিস্থাপন awk '{if(found) print} /TERMINATE/{found=1}' your_fileকরতে হবে awk 'found; /TERMINATE/{found=1}' your_file, তাদের উভয় একই জিনিস করা উচিত।
ব্যবহারকারী000001

7

নিম্নলিখিতগুলির মতো বাশ প্যারামিটার সম্প্রসারণ ব্যবহার করুন:

content=$(cat file)
echo "${content#*TERMINATE}"

আপনি কি করতে পারেন তা ব্যাখ্যা করতে পারেন?
যুগাল জিন্ডল

আমি "ফাইল" এর সামগ্রীটি $ সামগ্রী ভেরিয়েবলে অনুলিপি করেছি। তারপরে "TERMINATE" না হওয়া পর্যন্ত আমি সমস্ত অক্ষর সরিয়েছি। এটি লোভী মেলানো ব্যবহার করে নি, তবে আপনি # {বিষয়বস্তু দ্বারা # লোভী মেলানো ব্যবহার করতে পারেন ## * শর্ত}
মি কিয়াও

এখানে বাশ ম্যানুয়ালটির লিঙ্কটি রয়েছে: gnu.org/software/bash/manual/…
Mu Qiao

6
ফাইলটি যদি ১০০ জিবি আকারের হয় তবে কী হবে?
Znik

1
ডাউনভোট: এটি ভয়াবহ (ফাইলটি একটি ভেরিয়েবলের মধ্যে পড়া) এবং ভুল (ভেরিয়েবলটি উদ্ধৃতি না দিয়ে ব্যবহার করা; এবং আপনার সঠিকভাবে ব্যবহার করা উচিত printfবা নিশ্চিত হওয়া উচিত যে আপনি কী পাস করছেন তা অবশ্যই জানেন know echo)।
ট্রিপলি

6

গ্রেপ -A 10000000 'টার্মিনেট' ফাইল

  • বিশেষত সত্যিই বড় ফাইলটিতে কাজ করার চেয়ে অনেক দ্রুত। এটি 10M লাইন পর্যন্ত কাজ করে (বা যা কিছু আপনি রেখেছেন) তাই আপনার আঘাতের যে কোনও কিছুই পরিচালনা করার পক্ষে এটি এত বড় করার কোনও ক্ষতি নেই।

4

এটি দিয়ে sedবা করার অনেকগুলি উপায় রয়েছে awk:

sed -n '/TERMINATE/,$p' file

এটি TERMINATEআপনার ফাইলের সন্ধান করে এবং ফাইলটির শেষ পর্যন্ত সেই লাইন থেকে মুদ্রণ করে।

awk '/TERMINATE/,0' file

এটি হ'ল ঠিক তেমন আচরণ sed

আপনি যে রেখার থেকে মুদ্রণ শুরু করতে চান তার সংখ্যাটি যদি আপনি জানেন তবে আপনি এটি এক সাথে নির্দিষ্ট করতে পারবেন NR(রেকর্ডের সংখ্যা, যা শেষ পর্যন্ত রেখার সংখ্যাটি নির্দেশ করে):

awk 'NR>=535' file

উদাহরণ

$ seq 10 > a        #generate a file with one number per line, from 1 to 10
$ sed -n '/7/,$p' a
7
8
9
10
$ awk '/7/,0' a
7
8
9
10
$ awk 'NR>=7' a
7
8
9
10

সংখ্যার জন্য more +7 file
123

এর সাথে ম্যাচিং লাইন অন্তর্ভুক্ত রয়েছে, যা এই প্রশ্নে যা চেয়েছিল তা নয়।
mivk

@ মিভক ভাল, এটি গৃহীত উত্তর এবং ২ য় সর্বাধিক উত্সাহিতর ক্ষেত্রেও তাই সমস্যা বিভ্রান্তিকর শিরোনামের সাথে হতে পারে।
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

3

যদি কোনও কারণে, আপনি সেড ব্যবহার এড়াতে চান, নিম্নলিখিত TERMINATEফাইলটির শেষ পর্যন্ত লাইনটি মিলবে :

tail -n "+$(grep -n 'TERMINATE' file | head -n 1 | cut -d ":" -f 1)" file

এবং নিম্নলিখিতটি TERMINATEফাইলের শেষ না হওয়া অবধি নিম্নলিখিত লাইন থেকে মিলবে :

tail -n "+$(($(grep -n 'TERMINATE' file | head -n 1 | cut -d ":" -f 1)+1))" file

একটি প্রসেসে সেড কী করতে পারে এটি করতে 2 টি প্রক্রিয়া লাগে এবং যদি ফাইলটি গ্রেপ এবং লেজ প্রয়োগের মধ্যে পরিবর্তিত হয় তবে ফলাফলটি অন্তর্নিহিত হতে পারে, তাই আমি সেড ব্যবহার করার পরামর্শ দিই। তদতিরিক্ত, যদি ফাইল ডোনে না থাকে TERMINATEতবে প্রথম কমান্ড ব্যর্থ হয়।


ফাইল দুটি স্ক্যান করা হয়। এটি যদি 100 জিবি আকারের হয়?
Znik

1
ডাউনভোটেড কারণ এটি একটি কৃপণ সমাধান, তবে তারপরে upvated কারণ 90% উত্তরটি ক্যাভ্যাটস।
ম্যাড পদার্থবিজ্ঞানী


0

এটি এটি করার এক উপায় হতে পারে। আপনি যদি জানেন যে ফাইলটির কোন রেখায় আপনার গ্রেপ শব্দ রয়েছে এবং আপনার ফাইলে আপনার কতগুলি লাইন রয়েছে:

গ্রেপ -A466 'টার্মিনেট' ফাইল


1
যদি লাইন নম্বরটি জানা থাকে, তবে grepএমনকি প্রয়োজন হয় না; আপনি কেবল ব্যবহার করতে পারেন tail -n $NUM, সুতরাং এটি সত্যিই কোনও উত্তর নয়।
সামভিন

-1

সেড কাজের জন্য আরও ভাল সরঞ্জাম: সেড-এন '/ রি /, $ পি' ফাইল

যেখানে regexp হয়।

আর একটি বিকল্প হ'ল গ্রেপের - পরে-প্রসঙ্গের পতাকা। আপনার শেষ হতে একটি সংখ্যায় পাস করতে হবে, ফাইলটিতে ডাব্লুসি ব্যবহার করে থামাতে সঠিক মান দেওয়া উচিত। এটি -n এবং আপনার মিলের অভিব্যক্তির সাথে একত্রিত করুন।


- পরবর্তী-প্রসঙ্গটি ঠিক আছে তবে সব ক্ষেত্রে নয়।
যুগাল জিন্ডল

আপনি কি অন্য কিছু পরামর্শ দিতে পারেন .. ??
যুগাল জিন্ডল

-2

এগুলি ফাইলের শেষ অবধি সর্বশেষ পাওয়া লাইন "TERMINATE" থেকে সমস্ত লাইন মুদ্রণ করবে:

LINE_NUMBER=`grep -o -n TERMINATE $OSCAM_LOG|tail -n 1|sed "s/:/ \\'/g"|awk -F" " '{print $1}'`
tail -n +$LINE_NUMBER $YOUR_FILE_NAME

একটি লাইন নম্বর বের করা grepযাতে আপনি এটিকে খাওয়াতে পারেন তা tailহ'ল অপচয়হীন এন্টিপ্যাটার্ন। ফাইলটির শেষে ম্যাচটি সন্ধান করা এবং মুদ্রণ করা (বা, বিপরীতভাবে, মুদ্রণ এবং প্রথম ম্যাচে থামানো) সাধারণ, অপরিহার্য রেজেক্স সরঞ্জামগুলি দিয়ে বিশদভাবে সম্পন্ন হয়। প্রচুর পরিমাণে grep | tail | sed | awkএবং নিজের মধ্যে একটি বিশাল অকেজো ব্যবহার grepএবং বন্ধুদের মধ্যে রয়েছে
ট্রিপলি

আমি মনে করি তিনি * আমাদের এমন কিছু দেওয়ার চেষ্টা করছিলেন যা 'শেষবারের' / 'শর্তাবলীর' সন্ধান করবে এবং সেই উদাহরণটি থেকে লাইন দেবে। অন্যান্য বাস্তবায়ন আপনাকে প্রথম উদাহরণ দেয়। এর পরিবর্তে সম্ভবত LINE_NUMBER দেখতে এটি দেখতে হবে: LINE_NUMBER = $ (grep -o -n 'TERMINATE' $ OSCAM_LOG | دم -1 1 | অজক-ফ: '{মুদ্রণ $ 1}') সম্ভবত সবচেয়ে মার্জিত উপায় নয়, তবে এটি কাজটি মনে হচ্ছে। ^। ^
fbicknel

... বা সমস্ত এক লাইনে, তবে কুৎসিত: লেজ -n + $ (গ্রেপ-ওন 'টার্মিনেট' $ YOUR_FILE_NAME | লেজ -n 1 | অজক-ফ: '{মুদ্রণ $ 1}') $ YOUR_FILE_NAME
fbicknel

.... এবং আমি ফিরে গিয়ে $ YOUR_FILE_NAME এর পরিবর্তে $ OSCAM_LOG সম্পাদনা করতে যাচ্ছিলাম ... তবে কোনও কারণে তা করতে পারছি না। Idea OSCAM_LOG কোথা থেকে এসেছে তা ধারণা নেই; আমি কেবল নির্বুদ্ধিহীনভাবে এটিকে ব্যঙ্গ করেছি। ও
fbicknel

এই কাজটি শুধুমাত্র আওক-এ করা 101 আওক-এর একটি সাধারণ কাজ। আপনি যদি ইতিমধ্যে কেবলমাত্র লাইন নম্বর পেতে আরও সক্ষম সরঞ্জামটি ব্যবহার করছেন তবে চলুন tailএবং আরও কার্যকর সরঞ্জামটিতে পুরোপুরি কাজটি করতে দিন। যাইহোক, শিরোনাম পরিষ্কারভাবে "প্রথম ম্যাচ" বলে says
ট্রিপলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.