"লেজু - ফ" আউটপুট অন্য একটি ফাইলে লেখা হচ্ছে


34

আমার সর্বশেষ পোস্টের ধারাবাহিকতা হিসাবে যেখানে আমি grep & tail -f"বিরল" ইভেন্টগুলির উপস্থিতি খুঁজে পেয়েছি । আমি এটি অন্য একটি ফাইলে রেকর্ড করতে চাই।

আমি মোড় নেওয়ার চেষ্টা করেছি

tail -f log.txt | egrep 'WARN|ERROR'

মধ্যে

tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt

ফাইলটি তৈরি হয়ে যায়, তবে কিছুই জনবহুল হয় না, এটি কি ক্যাচিংয়ের সমস্যা বা অন্যথায়? আমি কীভাবে আমার লেজের আউটপুটটিকে একটি নতুন ফাইলে যুক্ত করতে একটি রিয়েল-টাইম যুক্ত করব?

উত্তর:


44

বাফারিংয়ের সমস্যা।

এটি এইভাবে করুন,

লেজ -f log.txt | উদাহরণস্বরূপ - লাইন-বাফারড 'WARN | ERROR' | টি ফিল্টার_আউটপুট। টেক্সট
# ^^^^^^^^^^^^^^^

সাইগউইনেও কাজ করার বিষয়টি নিশ্চিত করেছেন।


6

এটি সম্ভবত একটি বাফারিংয়ের সমস্যা। পাইপ ব্যবহার করার সময় অটো-বাফারিং অক্ষম করার জন্য এই এসও পোস্টটি দেখুন । আপনি এই unbufferআদেশটি ব্যবহার করতে পারেন expect:

$ unbuffer tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt

সম্পাদনা : যেহেতু আপনার দীর্ঘ পাইপলাইন রয়েছে, আপনার সম্ভবত প্রতিটি কমান্ড (শেষ ব্যতীত) আনফফার করা দরকার:

$ unbuffer tail -f log.txt | unbuffer egrep 'WARN|ERROR' | tee filtered_output.txt

সম্পাদনা 2 : সোর্স প্যাকেজ unbufferথেকে সাইগউইনে উপলভ্য রয়েছেexpect (উদাহরণস্বরূপ প্রত্যাশা -20030128-1-src.tar.bz2 , expect/examplesফোল্ডারে পাওয়া যায় ) তবে এটি একটি খুব স্বল্প স্ক্রিপ্ট। আপনার যদি expectপ্যাকেজটি ইতিমধ্যে ইনস্টল করা থাকে তবে কেবল unbufferএটি আপনার /usr/local/binডিরেক্টরিতে ডাকা স্ক্রিপ্টে রেখে দিন :

#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST

eval spawn -noecho $argv
set timeout -1
expect

ডেবিয়ানে, unbufferকমান্ডটি expect-devপ্যাকেজে সরবরাহ করা হয় এবং এটি ইনস্টল করা হয় expect_unbuffer


সাইগউইন দিয়ে এটি সম্পাদন করার উপায় আছে?
মাইক 15

সাইগউইন ব্যবহারে তথ্য যুক্ত; আপনার expectপ্যাকেজ লাগবে ।
কোয়াকোট কোয়েসোট

ধন্যবাদ, দুঃখের সাথে এখন সোমবার পর্যন্ত চেষ্টা করতে পারছি না। তারপরে আপডেট হবে।
মাইক 17

4

এমন কোনও কমান্ড ব্যবহার করার সময় যা সত্যিই 'সমাপ্ত' হয় না (যেমন tail -f), এটি আসলে কার্যকর হয় না বা এটি ভাল (মোটেও) কার্যকর হয় না।

আপনার কোনও পাঠ্য ফাইলে আউটপুট পুনর্নির্দেশ করতে সক্ষম হওয়া উচিত। এটা চেষ্টা কর:

tail -f log.txt | egrep 'WARN|ERROR' > filtered_output.txt

1
এটি কাজ করে না বলে মনে হচ্ছে।
মাইক 15

2

এটি unbufferআমার কাছে যে সংস্করণ :

#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST

if {[string compare [lindex $argv 0] "-p"] == 0} {
    # pipeline
    set stty_init "-echo"
    eval spawn -noecho [lrange $argv 1 end]
    close_on_eof -i $user_spawn_id 0
    interact {
    eof {
        # flush remaining output from child
        expect -timeout 1 -re .+
        return
    }
    }
} else {
    set stty_init "-opost"
    set timeout -1
    eval spawn -noecho $argv
    expect
}

অতিরিক্ত তথ্যের জন্য +1 ধন্যবাদ। dunno এটি সাইগউইন-বান্ধব তবে এটি আরও বুদ্ধিমান স্ক্রিপ্টের মতো দেখাচ্ছে।
কোয়াকোট কোয়েসোট

2

অন্যরা যেমন উল্লেখ করেছে, আপনি unbufferপ্রত্যাশা থেকে ইউটিলিটিটি ব্যবহার করতে পারেন ।

মনে রাখবেন, তবে আপনার সিস্টেম এবং প্রত্যাশার উপলভ্য সংস্করণটির উপর নির্ভর করে আপনার -pসুইফটি আনবুফার ব্যবহার করতে হবে । ম্যান পৃষ্ঠাটি উদ্ধৃত:

   Normally, unbuffer does not read from stdin.  This simplifies use of unbuffer in some situations.  To use unbuffer in a  pipeline,  use
   the -p flag.  Example:

           process1 | unbuffer -p process2 | process3

সুতরাং আপনার এই অনুরোধের প্রয়োজন হতে পারে:

unbuffer -p tail -f log.txt | unbuffer -p egrep 'WARN|ERROR' | tee filtered_output.txt

বিটিডাব্লু, আউটপুট বাফারিং সমস্যার পুরো ব্যাখ্যা দেওয়ার জন্য এই নিবন্ধটি দেখুন: http://www.pixelbeat.org/programming/stdio_buffering/

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