আমার কাছে একটি 8 গিগাবাইট লগ ফাইল রয়েছে (রেলগুলির উত্পাদনের লগ)। আমার কিছু খেজুর (রেখার) মাঝে কাটা দরকার। আমি কোন আদেশটি এটি করতে ব্যবহার করতে পারি?
sed
সহজেই তা করবে।
আমার কাছে একটি 8 গিগাবাইট লগ ফাইল রয়েছে (রেলগুলির উত্পাদনের লগ)। আমার কিছু খেজুর (রেখার) মাঝে কাটা দরকার। আমি কোন আদেশটি এটি করতে ব্যবহার করতে পারি?
sed
সহজেই তা করবে।
উত্তর:
কিছুটা এইরকম
sed '1,/last date prior to chunk/d;/first date after chunk/,$d' logfile | tee cut-log | less
tee cut-log
আপনাকে ফাইলের মধ্যে কী দেওয়া হচ্ছে তা স্ক্রিনে দেখতে দেয় cut-log
।
সম্পাদনা করুন:
ফ্রেড.বায়ারের এক্সট্যাক্ট মানগুলি পূরণ করার জন্য, এখানে একটি সেড সমাধান রয়েছে (যদিও যুক্তিসঙ্গতভাবে অ্যাজকের সমাধানটি অনেক সুন্দর):
b=BB; e=EE ;echo -e "AA\nAA\nBB\nBB\nCC\nCC\nDD\nDD\nEE\nEE\nFF\nFF" | sed -n ":b;/$b/b p;n;b b;:p;p;n;/$e/b e;b p;:e;p;n;/$e/b e;q"
sed
মিলতে পারে তা জানতে awk
এবং এটি আসলে কিছুটা দ্রুত ছিল।
এফইও এবং বিএআর সহ সকলের মধ্যে মুদ্রণের জন্য চেষ্টা করুন:
$ sed -n '/FOO/,/BAR/p' file.txt
এটি আপনি যা চান তা করবে ...
প্যারামিটারের তারিখগুলি সহ এবং বাদ দিয়ে উভয়ই প্রদর্শিত হবে।
# set Test args
set 2011-02-24 2011-02-26 "junk"
from="$1"
till="$2"
file="$3"
# EITHER ==== +++++++++
# Ouptut lines between two parameter dates INCLUDING the parameter dates
awk -v from=$from -v till=$till '
($2 >= from) && ($2 <= till) { print $0 ; next }
($2 > till) { exit }' "$file"
# OR ======== ---------
# Ouptut lines between two parameter dates EXCLUDING the parameter dates
awk -v from=$from -v till=$till '
($2 > from) && ($2 < till) { print $0 ; next }
($2 >= till) { exit }' "$file"
এটি ফিল্ড 2 এ একটি (সাজানো) তারিখের জন্য পরীক্ষা করে ... পরীক্ষার ডেটার জন্য এখানে উদাহরণ
98 2011-02-05 xxxx
99 2011-02-05 xxxx
100 2011-02-06 xxxx
101 2011-02-06 xxxx
এবং এখানে পরীক্ষার ডেটা জেনারেটর ।
awk -v from="$from" -v till="$till" '($2 >= from) { if ($2 <= till) { print } else { exit }' "$file"
if
বিবৃতি মোট (এমনকি 1 টি লাইন) অর্থাত। লজিক প্রবাহ কার্যকরভাবে একই, এবং রান সময় পার্থক্য ন্যানোসেকেন্ডে গণনা করা হবে .... আমি "অন্য" ব্যবহার না করার একমাত্র কারণ হ'ল এটি কার্যকরভাবে আমার প্রথম awk
স্ক্রিপ্ট (একদিন 4 বছর বাদে) এর আগে যখন আমি কয়েকটি উদাহরণ দিয়ে খেলেছি) ... এবং এটিই আমি খুঁজে পেল প্রথম কার্যক্ষম শাখা প্রক্রিয়া ... (এবং যেমনটি বলা হয়েছে এটি ঠিক তত দ্রুত) .. আমি উদারভাবে sed
চেষ্টা করিq
যদি আপনার লগ ফাইলে আপনার এই ফর্ম্যাটটিতে তারিখ থাকে YYYY-MM-DD
, তবে, 2011-02-10 বলার জন্য সমস্ত প্রবেশিকা খুঁজে পেতে, আপনি এটি করতে পারেন:
grep 2011-02-10 log_file
এখন বলুন, আপনি যদি 2011-02-10 এবং 2011-02-11-এর জন্য প্রবেশিকাগুলি সন্ধান করতে চান তবে আবার grep
একাধিক নিদর্শন সহ ব্যবহার করুন :
grep -E '2011-02-10|2011-02-11' log_file
grep
ফাইলের শুরুতে তারিখের সীমা থাকলেও পুরো ফাইলটি অনুসন্ধান করবে । গড় হিসাবে এটি অনুসন্ধানের সময়কে দ্বিগুণ করে, যখন "প্রস্থান-পরে-শেষ-আইটেম-ইন-রেঞ্জ" এর সাথে তুলনা করা হয় ... প্রশ্নটিতে উল্লিখিত 8 জিবি ফাইল আকারের কারণে আমি কেবল এটি উল্লেখ করতে বিরক্ত করছি গ্রেপ সময়ের ফলাফলগুলি এখানে সাদামাটা উদাহরণের সাথে প্রায় অভিন্ন (1 মিনিট 58 সেকসেট)। আমার সময় পরীক্ষার ফলাফলের লিঙ্কটি এখানে: পেস্ট.বুন্টু.com
এই আকারের ফাইলগুলির সাথে কাজ করা সবসময় শক্ত।
এগিয়ে যাওয়ার উপায় হতে পারে এই ফাইলটিকে কয়েকটি ছোট ছোট করে বিভক্ত করা, এটি করার জন্য আপনি বিভাজন কমান্ডটি ব্যবহার করতে পারেন।
split -d -l 50000 ToBigFile.data file_
এমনকি আপনি এটি বিভক্ত হয়ে গেলেও আপনি এখনও ফাইলটির সাথে লুপের জন্য ব্যাশ ব্যবহার করে এমন কাজ করতে পারেন
for f in `ls file_*`; do cat $f; done;
তবে বিড়ালের পরিবর্তে আপনি অযাচিত তথ্য থেকে মুক্তি পেতে ইনভার্টেড গ্রেপ ব্যবহার করতে পারেন, এটি এর জন্য অপ্রাসঙ্গিক। (বা আপনার যে ধরণের পরিশোধন প্রয়োজন)
এই মুহুর্তে আপনি কেবলমাত্র অনেক ছোট ফাইলের সাথে কাজ করবেন এবং উপরে উল্লিখিত অন্যান্য কমান্ডগুলি অনেকগুলি ছোট ফাইলগুলিতে হাসিখুশি কাজ করবে।
এবং আপনি যখন কাজটি শেষ করেন, আপনি আবার নতুন ছোট ফাইলটি তৈরি করতে লুপের জন্য একটি সেকেন্ড ব্যবহার করতে পারেন।
for f in `ls file_*`; do cat $f >> NewFile.data ; done;
আপডেট যেহেতু আমরা একাধিক ফাইলে ডেটা বিভক্ত করা শুরু করেছি, তাই হার্ডড্রাইভের সাথে প্রচুর কাজ হতে চলেছে এবং এতে সময় লাগে। (এই প্রশ্নে আপাতদৃষ্টিতে 5 মিনিট)
অন্যদিকে পরবর্তী পদক্ষেপগুলি সম্ভবত দ্রুততর হবে।
সুতরাং এই পদ্ধতিটি সম্ভবত সহজ গ্রেপ, অ্যাজক, সিড অপারেশনের জন্য অর্থহীন, তবে যদি অনুসন্ধানের ধরণগুলি আরও জটিল হয়ে যায় তবে এটি আরও দ্রুততর হতে পারে।
perl -wlne '/^2011-02-24/ .. /^2011-02-25/ and print' log_file