আমি কি কোনও ফাইলের প্রথম এন লাইন গ্রেপ করতে পারি?


126

আমার কাছে খুব দীর্ঘ লগ ফাইল রয়েছে, গ্রেপকে কেবল প্রথম 10 লাইন অনুসন্ধান করতে বলা সম্ভব?

উত্তর:


175

পাইপের যাদু;

head -10 log.txt | grep <whatever>

13
আপনি একটি স্বেচ্ছাসেবক স্ট্রিমটি এখানে পাইপও করতে পারেন head:someCmd | head -10
স্টুয়ার্ট নেলসন

1
স্ট্যান্ডার্ড আউটপুটে প্রথম 10 লাইন মুদ্রণের ক্ষেত্রে ডিফল্ট ডিফল্ট, সুতরাং এটি 10 ​​লাইনের জন্য বৈধhead log.txt | grep <whatever>
জ্লেমিনি

5
গ্রেপের -lবিকল্প ব্যবহার করার সময় কি এটি করার কোনও উপায় আছে ? আমি প্রথম পাঁচটি অক্ষর সমস্ত ফাইল তালিকাবদ্ধ করতে চাই RIFFD
জেমস এম। লে

49

লোকেরা যারা গুগলে এটি সন্ধান করে তাদের nজন্য আমার একাধিক ফাইলের প্রথম লাইনগুলি অনুসন্ধান করা দরকার , তবে কেবলমাত্র মিলে যাওয়া ফাইলের নামগুলি মুদ্রণের জন্য। আমি ব্যবহার করতাম

 gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames

FNR..nextfileস্টপ 10 টি লাইন একবার একটি ফাইল প্রক্রিয়াকরণের দেখা হয়েছে। //..{}কপি করে প্রিন্ট ফাইলের নাম এবং প্যাচসমূহ যখনই কোনো নির্দিষ্ট ফাইলের শো আপ প্রথম ম্যাচ। অন্যান্য প্রোগ্রামগুলির সুবিধার জন্য ফাইলের নামগুলি উদ্ধৃত করতে, ব্যবহার করুন

 gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames

9
গুগলে এটি খুঁজে পাওয়া লোকদের মধ্যে আমি একজন ছিলাম। ধন্যবাদ!
ফ্লোরিস

আমার জন্য, এই কোডটি ফাইলের পুরো পথটি মুদ্রিত করেছে। আমার যা প্রয়োজন ঠিক তা-ই। এছাড়াও FNR=1শুধু 1 ম লাইন অনুসন্ধান করবে। ধন্যবাদ!
ব্রায়ান ডব্লু

2
কোনও ডিরেক্টরিতে পুনরাবৃত্তভাবে এটি করতে:find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
অরেঞ্জডগ

1
ধন্যবাদ @ ওরেঞ্জডগ একটি সামান্য সংশোধন: হওয়া উচিত-type f
ডেভিড সিগাল

26

বা awkএকক প্রক্রিয়া ছাড়া ব্যবহার করুন |:

awk '/your_regexp/ && NR < 11' INPUTFILE

প্রতিটি লাইনে, যদি your_regexpম্যাচ হয়, এবং রেকর্ডের সংখ্যা (লাইন) 11 এর চেয়ে কম হয়, এটি ডিফল্ট ক্রিয়া সম্পাদন করে (যা ইনপুট লাইনটি মুদ্রণ করছে)।

বা ব্যবহার করুন sed:

sed -n '/your_regexp/p;10q' INPUTFILE 

আপনার রেজিপেক্সটি পরীক্ষা করে এবং লাইনটি -nমুদ্রণ করে (এর অর্থ ইনপুটটি প্রিন্ট করবেন না, যা অন্যথায় পূর্বনির্ধারিত), এবং 10 তম লাইনের পরে প্রস্থান করে।


1
দশম কেন ছাড়বেন না? (
সেড

awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile- দ্রুত

1
@ পটং আপনি সঠিক, সংশোধন করেছেন। @ শ্রীকানথ্রাদিক্স এটি দ্রুততর হওয়ার সাথে সাথে আপনি সমাধানটি রেগেক্সপ্স অনুসন্ধান করছেন না কেবল কেবল স্থির স্ট্রিংগুলির জন্য for awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfileআছে।
জেডসোল্ট বটিকাই

4
প্লাস শৈলী না awkish2xifsএবং 1xelseকোনও কমান্ডে যার কোনও ক্রিয়া বিবৃতি দরকার নেই আহো করবে। ওয়েইনবার্গার এবং কর্নিগান কান্না ...
জয়পাল সিংহ

1
আমি মনে করি, এনআর এর পরিবর্তে এফএনআর ব্যবহার করা আরও ভাল হবে, কারণ আপনি একাধিক ফাইলের সাথে খালি ব্যবহার করলে প্রতিটি ফাইলের জন্য এফএনআর 0 থেকে শুরু হয়।
ভ্লাদিস্লাভ সাভচেনকো

9

আপনার সাথে প্রোগ্রামগুলি ব্যবহার করে কয়েকটি বিকল্প রয়েছে grep। আমার মতে সবচেয়ে সহজটি হ'ল ব্যবহার করা head:

head -n10 filename | grep ...

headপ্রথম 10 লাইন আউটপুট আসবে ( -nবিকল্পটি ব্যবহার করে ), এবং তারপরে আপনি সেই আউটপুটটি পাইপ করতে পারবেন grep


6
আমি এমনকি বুঝতে পারছি না, সব সমাধান এখানে ব্যবহার headব্যবহার করেছেন -n 10 (আমি সহ) যে বুঝতে না headদ্বারা ডিফল্ট প্রদর্শন মাত্র 10 লাইন । :)
জয়পাল সিংহ



3

এটি সম্পাদন করার জন্য আউটপুটটি head -10 fileপাইপ করা যেতে পারে grep:

head -10 file | grep 

পার্ল ব্যবহার:

perl -ne 'last if $. > 10; print if /pattern/' file

3
head -10 log.txt | grep -A 2 -B 2 pattern_to_search

-A 2: প্যাটার্নের আগে দুটি লাইন মুদ্রণ করুন।

-B 2: প্যাটার্ন পরে দুটি লাইন মুদ্রণ।

head -10 log.txt # read the first 10 lines of the file.

1
যদি আমি স্মরণ করি, -C 2তবে একই -A 2 -B 2
কাজটি করবেন

3
grep -m6 "string" cov.txt

এটি কেবল প্রথম 6 টি লাইন অনুসন্ধান করে string


3
না, এটি আপনাকে পুরো cov.txt ফাইলে "স্ট্রিং" এর প্রথম occ টি উপস্থিতি দেবে
franzisk

2

জোয়াকিম Isaksson এর উত্তর করার জন্য একটি এক্সটেনশন: প্রায়ই আমি একটি দীর্ঘ ফাইল মাঝখানে কাছ থেকে কিছু, যেমন লাইন 5001 5020 থেকে যে ক্ষেত্রে আপনি একত্রিত করতে পারেন প্রয়োজন, headসঙ্গে tail:

head -5020 file.txt | tail -20 | grep x

এটি প্রথম 5020 লাইন পেয়েছে, তারপরে কেবলমাত্র শেষ 20 দেখায়, তারপরে সমস্ত কিছু গ্রেপ করার জন্য পাইপ দেয়।

(সম্পাদিত: আমার উদাহরণ সংখ্যায় ফেন্সপোস্ট ত্রুটি, গ্রেপের সাথে পাইপ যুক্ত করা হয়েছে)


1

গ্রেপ -A 10 <প্যাটার্ন>

এটি হ'ল প্যাটার্নটি এবং প্যাটার্নের পরে পরবর্তী 10 লাইন। এটি শুধুমাত্র একটি পরিচিত প্যাটার্নের জন্য ভাল কাজ করবে, যদি আপনার পরিচিত প্যাটার্নটি "মাথা" পরামর্শ ব্যবহার না করে।


1
যদিও এটি সঠিক হতে পারে। উত্তরকে আরও বিস্তৃত করতে প্রশ্নের আরও বিবরণ যুক্ত করুন।
প্রমোদ এস নিকম

3
এটি সম্পূর্ণ আলাদা প্রশ্নের উত্তর দেয় এবং এই প্রসঙ্গে কার্যকর নয়।
পূর্ব 101

-1

আমার একই রকম সমস্যা ছিল এবং উপরের সমস্ত সমস্যা একে পুরোপুরি সমাধান করে না। আমি মিলে যাওয়া লাইন থাকা ফাইলের নাম পেতে আগ্রহী। আমার সমাধান:

ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'

এনবি: আমার ক্ষেত্রে প্যাটার্নটি সর্বদা প্রথম লাইনের সাথে মেলে।

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