পুনরুক্তি দিয়ে ডিরেক্টরিতে প্রতিটি ফাইলের প্রথম 50 টি রেখা কীভাবে গ্রেপ করব?


10

আমাকে ডিরেক্টরি এবং এর উপ ডিরেক্টরিতে প্রতিটি ফাইলের প্রথম 50 টি লাইন সন্ধান করতে হবে।

এটি পুনরাবৃত্ত অংশটি করবে, তবে আমি কীভাবে প্রতিটি ফাইলের প্রথম 50 লাইন সীমাবদ্ধ করব?

grep -r "matching string here" .

এর মধ্যে কয়েকটি ফাইল বিশাল, এবং আমি কেবল প্রথম 50 লাইনে এগুলি মেলাতে চাই। আমি কিছু ফাইলগুলিতে বাইনারি ডেটা মেগাবাইট অনুসন্ধান না করে প্রক্রিয়াটি দ্রুত করার চেষ্টা করছি।


আপনি কি মিলে যাওয়া ফাইলগুলি জানতে চান, বা আপনি কি কেবল মিলে যাওয়া স্ট্রিং রাখতে চান বা ফাইলের নামের সাথে মিলে স্ট্রিং চান?
gniourf_gniourf

উত্তর:


11
  • আপনি যদি কেবল এই ফাইলগুলির সাথে মেলে চান:

    find . -type f -exec bash -c 'grep -q "matching string here" < <(head -n 50 "$1")' _ {} \; -printf '%p\n'
    

    অথবা

    find . -type f -exec bash -c 'grep -q "matching string here" < <(head -n 50 "$1") && printf '%s\n' "$1"' _ {} \;
    
  • আপনি যদি কেবল মিলে যাওয়া স্ট্রিংগুলি চান:

    find . -type f -exec head -n 50 {} \; | grep "matching string here"
    

    বা, আরও ভাল,

    find . -type f -exec head -q -n 50 {} + | grep "matching string here"
    
  • এবং যদি আপনি উভয়ই চান:

    find . -type f -exec bash -c 'mapfile -t a < <(head -n 50 "$1" | grep "matching string here"); printf "$1: %s\n" "${a[@]}"' _ {} \;
    

মন্তব্য.

  • sedকম্বো head- এর পরিবর্তে কিছুটা সহজ হতে পারে grep
  • আমাকে জোর দেওয়া যাক যে তিনটি পদ্ধতিই মজার মজার চিহ্ন (স্পেস, নিউলাইন ইত্যাদি) থাকতে পারে এমন ফাইলের নাম সম্পর্কিত 100% নিরাপদ।
  • এই দুটি পদ্ধতির মধ্যে, আমি ধরে নিচ্ছি আপনার কাছে বাশের একটি সাম্প্রতিক সংস্করণ রয়েছে।
  • আপনি -exec ... +প্রতিটি পদ্ধতিতে ব্যবহার করতে পারেন , তবে তারপরে আপনাকে নিজের অভ্যন্তরীণ লুপটি নিজেরাই কোড করতে হবে! (তুচ্ছ ব্যায়াম পাঠকের উপর ছেড়ে দেওয়া হয়েছে)। আপনার যদি গ্যাজিলিয়ন ফাইল থাকে তবে এটি খুব সামান্য দক্ষ হতে পারে।

4

মূল হিসাবে আপনার যদি গ্রেপ আউটপুট প্রয়োজন হয় তবে আপনি এটি করতে পারেন:

find . -type f | while read f; do 
  if head -n 50 "$f"|grep -s "matching string here"; then
    grep "matching string here" "$f" /dev/null 
  fi
done

আপনার যদি কেবলমাত্র ফাইলের নামের প্রয়োজন হয় তবে আপনি ২ য় গ্রেপ দিয়ে প্রতিস্থাপন করতে পারেন echo "$f"


1

কাঙ্ক্ষিত কার্যকারিতাটি পেতে আপনাকে কয়েকটি আলাদা আলাদা ইউটিলিটি একত্রিত করতে হবে। ব্যবহার করুন findডিরেক্টরি recurse করার কমান্ড সব ফাইল খুঁজে পেতে এবং চালানো headপ্রতিটি ফাইল পাওয়া কমান্ড। headকমান্ড শুধুমাত্র প্রথম 50 প্রতিটি ফাইল লাইনের ডাম্প ব্যবহার করা যেতে পারে। অবশেষে, আপনার পছন্দসই স্ট্রিংটি অনুসন্ধান করতে আউটপুটটি গ্রেপ করতে পাইপ করুন।

find . -type f -exec head -n 50 {} ";" | grep "matching string here"

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