লিনাক্সে একটি পাঠ্য ফাইল থেকে নির্দিষ্ট লাইনগুলি কীভাবে প্রদর্শন করবেন?


85

আমি সবার দরকারী লিনাক্স cmd কমান্ড লাইন ইউটিলিটি জানে অনুমান headএবং tailheadআপনাকে কোনও ফাইলের প্রথম এক্স লাইনগুলি মুদ্রণ করতে tailদেয়, একই কাজ করে তবে ফাইলটির শেষ প্রিন্ট করে। কোন ফাইলের মাঝখানে মুদ্রণের জন্য একটি ভাল কমান্ড কী? এর মতো কিছু middle --start 10000000 --count 20(10'000'000 তম 10'000'010 তম লাইন পর্যন্ত মুদ্রণ করুন)।

আমি এমন কিছু সন্ধান করছি যা বড় ফাইলগুলি দক্ষতার সাথে মোকাবেলা করবে। আমি চেষ্টা করেছি tail -n 10000000 | head 10এবং এটি ভয়াবহভাবে ধীর গতিতে।


উত্তর:


111
sed -n '10000000,10000020p' filename

আপনি এটির মতো সামান্য কিছুটা বাড়িয়ে দিতে সক্ষম হতে পারেন:

sed -n '10000000,10000020p; 10000021q' filename

ঐ কমান্ড সালে বিকল্প -nঘটায় sed"প্যাটার্ন স্থান স্বয়ংক্রিয় মুদ্রণ দমন" করা হয়েছে। pকমান্ড "মুদ্রণ [গুলি] বর্তমান প্যাটার্ন স্থান" এবং qকমান্ড "সঙ্গে সঙ্গে আর কোনো ইনপুট প্রক্রিয়াকরণের না করে প্রস্থান [গুলি] sed স্ক্রিপ্ট ..." উদ্ধৃতি থেকে এসেছ sed manপৃষ্ঠা

যাইহোক, আপনার আদেশ

tail -n 10000000 filename | head 10

ফাইলটির প্রান্ত থেকে দশ মিলিয়ন লাইনে শুরু হয় , যখন আপনার "মাঝারি" কমান্ডটি শুরু থেকে দশ মিলিয়নে শুরু হবে যা সমান হবে:

head -n 10000010 filename | tail 10

সমস্যাটি হচ্ছে ভেরিয়েবলের দৈর্ঘ্যের রেখাগুলির সাথে বাছাই করা ফাইলের জন্য যে কোনও প্রক্রিয়া ফাইলগুলি গণনা করে নতুন লাইনের মধ্য দিয়ে যেতে হয়। শর্টকাট করার কোনও উপায় নেই।

তবে, যদি ফাইলটি সাজানো হয় (উদাহরণস্বরূপ টাইমস্ট্যাম্প সহ একটি লগ ফাইল) বা নির্দিষ্ট দৈর্ঘ্যের লাইন থাকে তবে আপনি বাইট অবস্থানের ভিত্তিতে ফাইলটি সন্ধান করতে পারেন। লগ ফাইলের উদাহরণে, আপনি এখানে আমার পাইথন স্ক্রিপ্ট হিসাবে * বিভিন্ন সময় বাইনারি অনুসন্ধান করতে পারেন । স্থির রেকর্ড দৈর্ঘ্যের ফাইলের ক্ষেত্রে এটি সত্যিই সহজ। আপনি কেবল linelength * linecountফাইলটিতে অক্ষরগুলি সন্ধান করেন।

* আমি সেই স্ক্রিপ্টের আরও একটি আপডেট পোস্ট করার অর্থ রাখি। আজকের দিনগুলির মধ্যে এটির একটি পেতে পারি।


এখানে একটি হল sedচার্লসের সংস্করণ middleফাংশন: middle() { local s=$1 c=$2; shift 2; sed -n "$s,$(($s + $c -1))p; $(($s + $c))q" "$@"; }। এটি একাধিক ফাইল আর্গুমেন্ট, স্পেস সহ ফাইলের নাম ইত্যাদি পরিচালনা করবে Multi একাধিক ফাইলগুলি একসাথে প্রক্রিয়াজাত করা হয় যেন সেগুলি সাধারণতভাবে একইভাবে আঁকিয়ে রাখা হয়েছিল sed(সুতরাং মধ্যবর্তী 100 100 ফাইল1 ফাইল 2 প্রথম ফাইলটির শুরুতে শুরু পর্যন্ত বিস্তৃত হবে) দ্বিতীয়টির মধ্যে যদি প্রথমটির 1100 টিরও কম লাইন থাকে)।
ডেনিস উইলিয়ামসন

আমার আগের মন্তব্যে ফাংশনটি একটি ফাইলের নাম প্যারামিটার: middle startline count filenameবা একাধিক ফাইলের নাম: middle startline count file1 file2 file3বা পুনঃনির্দেশ সহ: middle startline count < filenameবা পাইপে: some_command | মাঝামাঝি শুরুর গণনা বাcat file* | middle startline count
ডেনিস উইলিয়ামসন

Your আপনার সিড কমান্ডের মধ্যে একটি হওয়া উচিত নয়? আমি এটি ব্যাকটিক দিয়ে কাজ করতে পারি না তবে এটি একক উদ্ধৃতি দিয়ে ভাল কাজ করে।
ইয়ান হান্টার 21

@ জিনল্যান্ড: হ্যাঁ, এটি টাইপো। আমি এটা ঠিক করেছি। ধন্যবাদ।
ডেনিস উইলিয়ামসন

1
@ কেভ: আমি আমার উত্তরে কিছু ব্যাখ্যা যুক্ত করেছি।
ডেনিস উইলিয়ামসন

28

আমি নিম্নলিখিত ব্যবহার খুঁজে পেয়েছি sed

sed -n '10000000,+20p'  filename

আশা করি এটি কারও উপকারী!


জেনে রাখা ভাল যে ডেনিস প্রস্তাবিত সর্বশেষ লাইনের যুক্তির বিকল্প রয়েছে: দ্বিতীয় sed -nযুক্তি হিসাবে একটি লাইন গণনা যা এটি যথেষ্ট পাঠযোগ্য করে তোলে।
ব্যবহারকারী3123159

একটি উদাহরণ ব্যবহার: extract_lines(){sed -n "$1,+$2p" <file>}যা stdout লিখেছে।
ব্যবহারকারী3123159

4

এখানে আমার প্রথম পোস্ট! যাইহোক, এই এক সহজ। ধরা যাক আপনি ফাইলটি.txt নামক ফাইল থেকে 8872 লাইন টানতে চান। কিভাবে আপনি এটা করবেন এখানে:

cat -n file.txt | গ্রেপ '^ * 8872'

এখন প্রশ্নটি এর পরে 20 টি লাইন সন্ধান করা। এটি করার জন্য আপনি এটি করেন

cat -n file.txt | গ্রেপ -A 20 '^ * 8872'

চারপাশে বা তার আগে লাইনগুলির জন্য গ্রেপ ম্যানুয়ালটিতে -B এবং -C পতাকাগুলি দেখুন।


যদিও এটি প্রযুক্তিগতভাবে সঠিক এবং যুক্তিযুক্ত আকারের ফাইলটিতে এটি করার একটি আকর্ষণীয় উপায়, পোস্টারটি যে আকারের ফাইলগুলির বিষয়ে জিজ্ঞাসা করছে তার ফাইলগুলির সাথে কাজ করার সময় আমি তার কার্যকারিতা সম্পর্কে আগ্রহী।
জেনি ডি

একাধিক লাইন: cat -n file.txt | গ্রেপ "^ \ s \ + (10 \ | 20 \ | 30) \ এস \ +"
জেফ্রি নাইট

cat -n file.txt | grep '^ *1'ডান পাশে 1 টি রয়েছে এমন সমস্ত লাইন উত্পন্ন করুন। এই কৌশলটি দিয়ে কীভাবে লাইন 1 আউটপুট করবেন? আমি জানি যে আমি -n 1 হেড করতে পারি .... তবে গ্রেপ কীভাবে ব্যবহার করব?
Sean87

1

ডেনিসের খারাপ উত্তর হ'ল উপায়। তবে ব্যাশের অধীনে কেবল মাথা ও লেজ ব্যবহার করুন:

মাঝারি () {মাথা-নি $ [$ 1 + $ 2] | লেজ -n $ 2; }

এটি প্রথম $ 1 + $ 2 টি লাইন দু'বার স্ক্যান করে, তাই ডেনিসের উত্তরের চেয়েও খারাপ। তবে এটি ব্যবহারের জন্য আপনাকে সেই সমস্ত চালিত চিঠিগুলি মনে রাখার দরকার নেই ....


$[...]কমপক্ষে বাশ-এ ব্যবহার করা অবচিত হয়। এছাড়াও, আপনি একটি ফাইল প্যারামিটার মিস করছেন।
ডেনিস উইলিয়ামসন

@ ডেনিস: অনুপস্থিত প্যারামিটার: আপনি স্ট্যান্ডিনে এটি ব্যবহার করার কথা বলতে চাইছেন middle 10 10 < /var/log/auth.log
চার্লস স্টুয়ার্ট

1

নির্দিষ্ট রেখার রেঞ্জ পেতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন

awk 'NR < 1220974{next}1;NR==1513793{exit}' debug.log | tee -a test.log

এখানে ডিবাগ.লগ আমার ফাইল যা লাইনগুলির অভাব নিয়ে গঠিত এবং আমি 1220974 লাইন নম্বর থেকে 1513793 এ ফাইল টেস্ট.লগে প্রিন্ট করতাম। আশা করি এটি লাইনের পরিসীমা ক্যাপচারের জন্য সহায়ক হবে।


সার্ভারফল্ট /a/641252/140016 হিসাবে একই উত্তর । Downvoted।
হরিণ হান্টার

এটি একই উত্তর নয়। এটি বৃহত ফাইলগুলির জন্য দ্রুত হওয়া উচিত কারণ ফাইলের মাধ্যমে স্ক্যান চালিয়ে যাওয়ার পরিবর্তে এটি শেষ লাইনটি মুদ্রণের পরে প্রকৃতপক্ষে বাতিল হয়।
ফোবি

0

একটি রুবি অনেলিনার সংস্করণ।

ruby -pe 'next unless $. > 10000000 && $. < 10000020' < filename.txt

এটি কারও কাজে লাগতে পারে। ডেনিস এবং ডক্স দ্বারা সরবরাহিত 'সেড' সহ সমাধানগুলি খুব দুর্দান্ত, এমনকি এটি দ্রুত বলে মনে হচ্ছে।


0

আপনি 'এনএল' ব্যবহার করতে পারেন।

nl filename | grep <line_num>

0

উদাহরণস্বরূপ, এই উত্তম 20 এবং 40 এর মধ্যে লাইনগুলি মুদ্রণ করবে

awk '{if ((NR> 20) && (NR <40)) প্রিন্ট করুন $ 0}' / ইত্যাদি / পাসডাব্লুড


0

আপনি যদি লাইন নাম্বারগুলি জানেন তবে বলুন যে আপনি কোনও ফাইল থেকে 1, 3 এবং 5 লাইন পেতে চান, / ইত্যাদি / পাসডাব্লুড বলুন:

perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd

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