বৃহত পাঠ্য ফাইলে গ্রেপ / সেড ব্যবহার করে তারিখের পরিসর থেকে পাঠ্য কীভাবে পাবেন?


9

আমার কাছে বড় ফাইল পাঠ্য রয়েছে (প্রায় 3 জিবি) - এটি একটি লগ ফাইল। আমি 13 জুলাই থেকে 19 জুলাই পর্যন্ত এই ফাইলটি থেকে বিভিন্ন তারিখের সাথে মিল রেখে পাঠ্যের লাইন পেতে চাই। আমার লগ ফর্ম্যাটটি হ'ল:

2016-07-12 < ?xml version>
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
2016-07-20 < ?xml version>
sample text sample text
sample text sample text
sample text sample text
2016-07-20 < ?xml version>
sample text sample text
2016-07-20 < ?xml version>

সুতরাং grep/ পরে sedএটি এর মতো আউটপুট হওয়া উচিত:

2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>

আমি এটি কিভাবে পেতে পারি?


2
আপনি কি নিশ্চিত আপনি জুন মানে ? আপনার নমুনা লগ ফাইলে সমস্ত তারিখ জুলাই হয় এবং কাঙ্ক্ষিত আউটপুট নমুনা বোঝায় আপনি পরে বোঝানো হয়েছে।
ডেভিড ফোস্টার

উত্তর:


13

আপনি grepযদি লাইনের সংখ্যা জানেন তবে আপনি -Aপ্যাটার্নের পরে লাইনগুলি প্রিন্ট করতে প্রসঙ্গ বিকল্প ব্যবহার করতে পারেন

grep -A 3 2016-07-13 file

এটি আপনাকে 2013-07-13 এবং পরবর্তী 3 টি লাইনের সাথে লাইন দেবে

আপনার সাথে sedতারিখগুলি এভাবে ডিলিট করতে ব্যবহার করতে পারেন

sed -n '/2016-07-13/,/2016-07-19/p' file

যা ২০১০-০7-১ with পর্যন্ত প্রথম লাইন থেকে সমস্ত পংক্তি মুদ্রণ করবে এবং ২০১ 2016-০7-১-19 এর সাথে প্রথম লাইনটি অন্তর্ভুক্ত করবে। তবে এটি ধরে নিয়েছে যে আপনার কাছে 2016-07-19 এর সাথে কেবল একটি লাইন রয়েছে (এটি পরবর্তী লাইনটি প্রিন্ট করবে না)। যদি একাধিক লাইন থাকে তার পরিবর্তে পরবর্তী তারিখটি ব্যবহার করে এবং dএটি থেকে আউটপুট মুছতে ব্যবহার করুন

sed -n '/2016-07-13/,/2016-07-20/{/2016-07-20/d; p}' file

11

এই সাধারণ গ্রেপ ওয়ান লাইনার যথেষ্ট হবে:

grep -E ^2016-07-1[3-9] filename

এখানে সুন্দরভাবে কাজ করে এবং সেডের কোনও প্রয়োজন নেই :)

তথ্যসূত্র:


1
সর্বদা আপনি অনুগ্রহ আনবেন :)
Zanna

(y) ... ^এটি কাজ করতে অপসারণ করতে হয়েছিল। ম্যাক ব্যবহার করা হচ্ছে।
আনম শেরাজ

4

awk সমাধান:

$ awk '/^2016-07-13.*/,/2016-07-19.*/'  input.txt                                   
2016-07-13 < ?xml version> 
2016-07-18 < ?xml version> 
2016-07-18 < ?xml version> 
2016-07-19 < ?xml version> 

মূলত যেটি শুরু হয় তার 2016-07-13থেকে শুরু হওয়া কোনও লাইন মুদ্রণ করে2016-07-19


4

অন্যান্য সমস্ত বর্তমান উত্তরগুলি লগ ফাইলের এন্ট্রিগুলি কালানুক্রমিকভাবে বাছাই করা হয় বা নিয়মিত প্রকাশের সাথে তারিখের সীমাটি সহজেই মিলে যায় এই সত্যের উপর নির্ভর করে। আপনি যদি আরও জেনেরিক সমাধান চান তবে আমাদের আরও কিছু প্রোগ্রামিং করতে হবে।

আমি এই GNU AWK স্ক্রিপ্টটি উপস্থাপন করছি:

#!/usr/bin/gawk -f
BEGIN {
    starttime = mktime(starttime)
    endtime = mktime(endtime)
}

func in_range(n, start, end) {
    return start <= n && n < end
}

match($0, /^([0-9]{4})-([0-9]{2})-([0-9]{2})\s/, m) &&
    in_range(mktime(m[1] " " m[2] " " m[3] " 00 00 00"), starttime, endtime)

আপনি ভেরিয়েবলগুলির মাধ্যমে starttimeএবং ( ) বোঝে endtimeএমন বিন্যাসে সূচনা এবং শেষ সময় সরবরাহ করেন । সুতরাং আপনি এইভাবে কমান্ডটি চালাচ্ছেন , ধরে নিবেন যে উপরের অ্যাওক স্ক্রিপ্টটি বর্তমান কার্যনির্বাহী ডিরেক্টরিতে একটি এক্সিকিউটেবল ফাইলে রয়েছে এবং লগ ফাইলটি হ'ল :mktimeYYYY MM DD hh dd ssawkfilter-log-dates.awkmylog.txt

./filter-log-dates.awk -v starttime='2016 07 13 00 00 00' -v endtime='2016 07 20 00 00 00' mylog.txt

নোট করুন যে শেষ সময়টি একচেটিয়া , অর্থাৎ বৈধ লগ রেকর্ডগুলির অবশ্যই শেষ সময়ের আগে সময় স্ট্যাম্প থাকতে হবে ।

যদি আপনার সময়ের স্ট্যাম্পের ফর্ম্যাটটি আলাদা হয় তবে matchআপনি যথাযথভাবে ফাংশনে পাস হওয়া নিয়মিত এক্সপ্রেশনটি সামঞ্জস্য করতে পারেন।


3

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

grep -n 2016-07-13 bigtextfile | head -1
grep -n 2016-07-19 bigtestfile | tail -1
# Say the first number is 1234 and the second 5678, then use...
awk 'NR>=1234 && NR<=5678' bigtestfile > rangeoftext

এটি একটি awkকমান্ডে সমস্ত করা যেতে পারে তবে পদক্ষেপগুলি অনুসরণ করা আরও সহজ করে তুলতে পারে। অজস্র অভ্যন্তরে এনআর ভেরিয়েবলটি বর্তমান লাইন নম্বর এবং যেহেতু প্যাটার্নের পরে কোনও ক্রিয়া নির্দিষ্ট করা হয়নি (এনআর> = 1234 && এনআর <= 5678) ডিফল্ট ক্রিয়াটি সেই ব্যাপ্তির রেখাটি মুদ্রণ করে।

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