লগ ফাইল থেকে অংশ কাটা কিভাবে?


18

আমার কাছে একটি 8 গিগাবাইট লগ ফাইল রয়েছে (রেলগুলির উত্পাদনের লগ)। আমার কিছু খেজুর (রেখার) মাঝে কাটা দরকার। আমি কোন আদেশটি এটি করতে ব্যবহার করতে পারি?


1
ওহে ছেলেরা, এই প্রশ্নটি একটি বড় ফাইল সম্পর্কিত, সুতরাং এটি "অ্যান্ট আপ!" .. সময়ের বিষয় ... আমি 85 ই 4040 লাইন (প্রতি লাইনে 100 টি অক্ষর) সহ একটি বাস্তব 8 গিগাবাইট ফাইলে অনুকূল সাড স্ক্রিপ্ট পরীক্ষা করেছি। আমি সেড পছন্দ করি, তবে এটি যেমন দাঁড়িয়ে আছে ততক্ষণে স্ক্রিপ্ট স্ক্রিপ্টটি পুরো ফাইলটি স্ক্যান করে । এটি এজেওসি স্ক্রিপ্টের তুলনায় এটি গড় দ্বিগুণ ধীর হয়ে যায় যা যখন খুঁজে পাওয়া যায় ... আমি মনে করি (?) সেড স্ক্রিপ্টটিতে দ্বিতীয় এক্সপ্রেশনটির জন্য ডি এর পরিবর্তে কেবল আক প্রয়োজন হতে পারে ... পরীক্ষার ফলাফলগুলি এখানে: পেস্ট করুন .ubuntu.com / 573477 .. এছাড়াও, এটি সঠিক আউটপুট উত্পাদন করে না .. শেষে সাউন্ডমোভের উত্তরটিতে আমার মন্তব্য দেখুন।
পিটার.ও

সাউন্ডমোভের নতুন এসইডি সংস্করণটি গতির সমস্যাটিকে সম্বোধন করেছিল এবং এটি এখন ছত্রাকের গতির সাথে মেলে। এবং নতুন ভার্সেন্ট এখন তথ্য সঠিকভাবে আউটপুট দেয় ... আরও বিশদে তার মন্তব্য দেখুন।
পিটার.ও

আমি কেবল লক্ষ্য করেছি যে আপনি "কাটা" বলেছেন (যার অর্থ সাধারণত মুছে ফেলা হয়) ... আপনি কি সত্যই "কাট" বলতে চান, বা আপনি "অনুলিপি" বলতে চান? .... যদি আপনি "কাটা" বোঝাতে চেয়েছিলেন তবে sedসহজেই তা করবে।
পিটার.ও

উত্তর:


12

কিছুটা এইরকম

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"


3
@ ডগবনে: হ্যাঁ, হ্যাঁ সম্পাদনা করা হয়েছে। আমি নিশ্চিত আপনি মাঝে মাঝে অনুকূল কোডের চেয়ে কম লেখেন, এটি কি এমন কঠোর মন্তব্যের প্রাপ্য?
asoundmove

1
দ্রষ্টব্য: যদি একই তারিখের সাথে একাধিক পরপর 'প্রথম-তারিখ' লাইন থাকে তবে প্রথমটি ছাড়া সমস্তগুলি মুছে ফেলা হবে না এবং আউটপুটটির সাথে পরিচয় করানো হবে ... সচেতন হওয়ার জন্য কেবল কিছু ... (এটি নির্ভর করে পরিস্থিতি)
পিটার.ও

1
... তবে যদিও আমি প্রো-সিড ++ থাকা সত্ত্বেও, আমি মনে করি যে এই নির্দিষ্ট কাজটি তার নিজের সীমা ছাড়িয়ে গেছে, নিজের ব্যক্তিগত সরঞ্জাম ব্যতীত অন্য কোনও কিছুর জন্য .. এই ক্ষেত্রে মূল সমস্যাটি এখানে (আপনার এবং এবং আমার .. আমি আপনার মত একই কাজ করতে সক্ষম হয়েছি .. এটি 1% এর মধ্যেও ছড়িয়ে পড়েছিল) .. মূল ইস্যুতে ফিরে আসে .. (যা অ্যাডকের ক্ষেত্রে প্রযোজ্য নয়) .... বাগ (স্থিরযোগ্য নয়): লগের ক্ষেত্রের মধ্যে বৈধ যে তারিখটি সম্পর্কে, তবে লগটিতে আসলে উপস্থিত নেই, 1 ম আর্গের ক্ষেত্রে কোনও কিছুই প্রিন্ট করার কারণ হবে না এবং ২ য় আর্গের ক্ষেত্রে সেড উইল সবকিছু মুদ্রণ করবে প্রথম তারিখের পরে! ... আরও ...
পিটার.ও

1
আরেকটি, স্থিরযোগ্য ত্রুটি: এটি বর্তমানে ডেটা প্রোটন সহ যে কোনও লাইনে যে কোনও তারিখের সাথে মিলে যায় তবে এটি কেবল একটি রেজেক্স টুইঙ্ক .. এবং যে কেউ এটি ব্যবহার করতে চান, সম্ভবত আপনি মন্তব্য করতে পারেন যে এখন আরোগুলি প্রথমটি উল্লেখ করে এবং পরিসরে সর্বশেষ তারিখগুলি (-1 এবং +1 নয়) .. এবং অবশেষে .. আমার "বহন করার মান" আমার নয়। আমি কেবলমাত্র প্রশ্নকারীদের অনুরোধের বার্তাবহ ... ব্যবহারকারী যদি অনুরোধ অনুযায়ী কাজ করে তবে তা লক্ষ্য করবেন না .. এটি আমার কাছে একটি দুর্দান্ত প্রশ্ন হয়ে গেছে .. আমি অনেক কিছু শিখেছি :) ... এবং আমি আনন্দিত যা গতির সাথে sedমিলতে পারে তা জানতে awkএবং এটি আসলে কিছুটা দ্রুত ছিল।
পিটার.ও

6

এফইও এবং বিএআর সহ সকলের মধ্যে মুদ্রণের জন্য চেষ্টা করুন:

$ sed -n '/FOO/,/BAR/p' file.txt

1
দ্রষ্টব্য: এটি কেবল ধারাবাহিক বারের সিরিজের প্রথম বার প্রিন্ট করবে ...
পিটার.ও

অন্য দ্রষ্টব্য ... তারিখগুলির মধ্যে একটিও ডেটাতে উপস্থিত না থাকলে বড় সমস্যা .. শেষ তারিখটি উপস্থিত না থাকলে সেড ইওএফ পৌঁছানো অবধি আউটপুট লাইন রাখবে।
পিটার.ও

5

এটি আপনি যা চান তা করবে ...
প্যারামিটারের তারিখগুলি সহ এবং বাদ দিয়ে উভয়ই প্রদর্শিত হবে।

# 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"
asoundmove

@asoundmove: হ্যাঁ, যে পারে চেহারা ভাল, এবং এটি স্পষ্টভাবে বেশি প্রচলিত , কিন্তু বাস্তবে তার সঞ্চালনের সময় 1 অতিরিক্ত একমাত্র সময়কাল ifবিবৃতি মোট (এমনকি 1 টি লাইন) অর্থাত। লজিক প্রবাহ কার্যকরভাবে একই, এবং রান সময় পার্থক্য ন্যানোসেকেন্ডে গণনা করা হবে .... আমি "অন্য" ব্যবহার না করার একমাত্র কারণ হ'ল এটি কার্যকরভাবে আমার প্রথম awkস্ক্রিপ্ট (একদিন 4 বছর বাদে) এর আগে যখন আমি কয়েকটি উদাহরণ দিয়ে খেলেছি) ... এবং এটিই আমি খুঁজে পেল প্রথম কার্যক্ষম শাখা প্রক্রিয়া ... (এবং যেমনটি বলা হয়েছে এটি ঠিক তত দ্রুত) .. আমি উদারভাবে sedচেষ্টা করিq
পিটার.ও

আমি বুঝতে পারি না আপনি এই পদ্ধতিতে পাঠ্য ফাইলের নাম এবং অবস্থান কোথায় দিয়েছেন? কেউ আমার বোকামির মধ্য দিয়ে আমাকে দেখতে সহায়তা করতে পারে
গাইলস

4

যদি আপনার লগ ফাইলে আপনার এই ফর্ম্যাটটিতে তারিখ থাকে 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
পিটার.ও

1

এই আকারের ফাইলগুলির সাথে কাজ করা সবসময় শক্ত।

এগিয়ে যাওয়ার উপায় হতে পারে এই ফাইলটিকে কয়েকটি ছোট ছোট করে বিভক্ত করা, এটি করার জন্য আপনি বিভাজন কমান্ডটি ব্যবহার করতে পারেন।

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 মিনিট)

অন্যদিকে পরবর্তী পদক্ষেপগুলি সম্ভবত দ্রুততর হবে।

সুতরাং এই পদ্ধতিটি সম্ভবত সহজ গ্রেপ, অ্যাজক, সিড অপারেশনের জন্য অর্থহীন, তবে যদি অনুসন্ধানের ধরণগুলি আরও জটিল হয়ে যায় তবে এটি আরও দ্রুততর হতে পারে।


3
জোহানম, আমার কম্পিউটারে 8 গিগাবাইট লগ ফাইল অনুসন্ধান করতে, গড়ে মাত্র 1 মিনিট সময় লাগে এবং ঠিক একই কম্পিউটারে, কেবল ইনিটাল ফাইল বিভাজনে 4 মিনিট 43 সেকেন্ড লাগে ... :)
পিটার.ও

ধরা যাক যে আপনি ছোট ফাইলগুলিতে সেইগুলি অবাস্তব এবং সময়গুলি 50% কেটে ফেলতে পারেন। তারপরে মোট সময় অর্জনের পূর্বে আমাদের এখনও 10 টিরও বেশি অপারেশন করা দরকার ... সুতরাং ফাইল বিভাজনটি কয়েকটি রিগ্রেশনগুলির জন্য সেরা ধারণা নয় ...
জোহান

আরএজি স্ক্রিপ্টটি (সহজেই) একটি পৃথক পাসে 10 টি আলাদা অনুসন্ধান ফলাফলকে 10 টি ফাইলে আউটপুটে পরিবর্তন করা যেতে পারে ... তবে একক পাসে এটি পড়ার গতি কমিয়ে দেয় ... তবে রিপোর্টটি আউটপুট দেওয়ার সময় শেডও একই কাজ করতে পারে তবে আমি যেমন 'সাউন্ডমোভের মন্তব্যে উল্লিখিত হয়েছে, কোনও নির্দিষ্ট তারিখ / সময় লগটিতে প্রবেশ করা না থাকলে সেড ব্যর্থ হবে (উদাহরণস্বরূপ, আপনি ঘন্টাটি অনুসন্ধান করছেন) .. আমি প্রচুর সেড ব্যবহার করি এবং এটি অত্যন্ত দরকারী তবে এটির সীমাবদ্ধতা রয়েছে ... সেড বনাম awk কখন ব্যবহার করবেন সে সম্পর্কে একটি সেড এফএকিউ এখানে দেওয়া হয়েছে .. আমি অগত্যা এটির সবগুলির
পিটার। ও

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