প্রশ্ন কিভাবে লিনাক্সে পাঠ্য ফাইল থেকে কিছু লাইন প্রদর্শন করবেন?


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

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


73
2018-04-19 08:53


উত্স


সম্ভাব্য সদৃশ serverfault.com/questions/101900/... - Kyle Brandt♦


উত্তর:


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 ফাইল মধ্যে অক্ষর।

* আমি এখনও সেই স্ক্রিপ্টে আরেকটি আপডেট পোস্ট করার অর্থ রাখি। হয়তো আমি এই দিন এক কাছাকাছি পাবেন।


93
2018-04-19 09:11



এখানে একটি sed চার্লস এর সংস্করণ middle ফাংশন: middle() { local s=$1 c=$2; shift 2; sed -n "$s,$(($s + $c -1))p; $(($s + $c))q" "$@"; }। এটি একাধিক ফাইল আর্গুমেন্ট, স্পেস সহ ফাইলের নামগুলি হ্যান্ডেল করবে। একাধিক ফাইল একসঙ্গে প্রসেস করা হবে যেন সেগুলি একইভাবে catted হয়েছে sed সাধারণত (প্রথম মাঝখানে 1100 লাইনের কম থাকে তবে দ্বিতীয়টির শুরুতে প্রথম ফাইলের শেষের দিকে মধ্যবর্তী 1000 100 ফাইল 1 ফাইল 2 টি পূর্ণ হবে)। - Dennis Williamson
আমার পূর্ববর্তী মন্তব্যের ফাংশনটি একটি ফাইলের নাম পরামিতি দিয়ে বলা যেতে পারে: middle startline count filename বা একাধিক ফাইলের নাম: middle startline count file1 file2 file3 অথবা পুনঃনির্দেশ সঙ্গে: middle startline count < filename অথবা একটি পাইপ মধ্যে: some_command | মাঝারি startline গণনা 'বা cat file* | middle startline count - Dennis Williamson
আপনার sed কমান্ড 'একটি হতে হবে না? আমি ব্যাকটিক দিয়ে কাজ করতে পারছি না কিন্তু এটি একক উদ্ধৃতি দিয়ে ভাল কাজ করে। - Ian Hunter
@ ইবানল্যান্ড: হ্যাঁ, এটি একটি টাইপো। আমি এটা ঠিক করেছি। ধন্যবাদ। - Dennis Williamson
@ কেভিভি: আমি আমার উত্তরের কিছু ব্যাখ্যা যোগ করেছি। - Dennis Williamson


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

sed -n '10000000,+20p'  filename

এটা কারো জন্য দরকারী আশা করি!


25
2018-06-17 18:22



ডেনিস দ্বারা প্রস্তাবিত শেষ লাইনের যুক্তিটির বিকল্প আছে জানতে ভাল: দ্বিতীয় হিসাবে একটি লাইন গণনা sed -n যুক্তি যা বেশ পাঠযোগ্য করে তোলে। - user3123159
একটি উদাহরণ ব্যবহার: extract_lines(){sed -n "$1,+$2p" <file>} যা stdout লিখেছেন। - user3123159


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

বিড়াল- n file.txt | grep '^ * 8872'

এখন প্রশ্নটি পরে ২0 টি লাইন খুঁজে বের করতে হবে। আপনি এই কাজ করতে

বিড়াল- n file.txt | grep-A 20 '^ * 8872'

চারপাশের লাইনগুলির জন্য বা grep ম্যানুয়াল-বি এবং -সি ফ্ল্যাগগুলি দেখুন।


4
2018-05-23 12:11



যদিও এটি টেকনিক্যালি সঠিক এবং একটি যুক্তিসঙ্গত আকারের ফাইলটিতে এটি করার একটি আকর্ষণীয় উপায়, পোস্টারটির আকারের ফাইলগুলির সাথে কাজ করার সময় আমি কার্যকারিতা সম্পর্কে আগ্রহী। - Jenny D
একাধিক লাইন: cat -n file.txt | grep "^ \ s \ + (10 \ | 20 \ | 30) \ s \ +" - Jeff K.
cat -n file.txt | grep '^ *1' তাদের ডান পাশে আছে যে সমস্ত লাইন উত্পাদ। কিভাবে এই কৌশল সঙ্গে লাইন আউটপুট 1? আমি জানি আমি 1 ম শিরোনাম করতে পারি .... কিন্তু কিভাবে grep ব্যবহার করবেন? - Sean87


ডেনিস 'sed উত্তর যেতে উপায়। কিন্তু মাথা এবং লেজ ব্যবহার করে, ব্যাশের নীচে:

মধ্যম () {হেড-এন $ [$ 1 + $ 2] | পুচ্ছ - N $ 2; }

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


1
2018-04-19 15:08



ব্যবহার $[...] অন্তত বাশ, অন্তর্বর্তী হয়। এছাড়াও, আপনি একটি ফাইল পরামিতি অনুপস্থিত। - Dennis Williamson
@ ডেনিস: কোন অনুপস্থিত প্যারামিটার নেই: আপনি স্টেডিনে এটি ব্যবহার করতে চান middle 10 10 < /var/log/auth.log। - Charles Stewart


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

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

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


1
2018-04-17 19:48



একই উত্তর serverfault.com/a/641252/140016। Downvoted। - Deer Hunter
এটা একই উত্তর নয়। এটি ফাইলের মাধ্যমে স্ক্যানিং চালিয়ে যাওয়ার পরিবর্তে শেষ লাইন মুদ্রণ করার পরে এটি আসলে বড় ফাইলগুলির জন্য দ্রুত হওয়া উচিত। - phobic


একটি রুবি oneliner সংস্করণ।

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

এটা কারো জন্য দরকারী হতে পারে। ডেনিস এবং ডক্স দ্বারা সরবরাহিত 'sed' এর সমাধানগুলি খুব দ্রুত, এমনকি এটি দ্রুত বলে মনে হয়।


0
2018-05-23 12:58





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

nl filename | grep <line_num>

0
2017-10-31 19:35





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

awk '{if ((NR> 20) && (NR <40)) $ 0} মুদ্রণ করুন' / etc / passwd


0
2017-10-31 22:02