লেজ -ফ, লাইন পরে লাইন বিরতি sertোকান 3 সেকেন্ডের জন্য অলস?


14

একটি করার সময় tail -f error.log, 3 সেকেন্ডের জন্য ফাইলটিতে কিছুই সংযুক্ত না হওয়ার পরে প্রোগ্রামগতভাবে একটি লাইন ব্রেক কীভাবে সন্নিবেশ করা যায়?

(স্পষ্টতই, একবার এক লাইন বিরতি যুক্ত হয়ে গেলে লগ ফাইলটিতে পাঠ্যগুলির অন্যান্য লাইন যোগ করা না হওয়া অবধি অন্য কোনও লাইন ব্রেক যুক্ত করা উচিত নয়)

উদাহরণস্বরূপ, এই লাইনগুলিকে ত্রুটিযুক্ত করা হয়েছে .লগ:

foo
bar
boo [[wait 4 seconds]]
2far
2foo
2bar
2boo [[wait 40 seconds]]
2far

এটি কনসোলে আউটপুট হবে:

foo
bar
boo

2far
2foo
2bar
2boo

2far

আপনি সম্ভবত আমার ফাংশন খাপ খাওয়ানো পারে askubuntu.com/a/993821/158442 , বা ব্যবহারের tsআউটপুট timestamping যোগ করতে পারেন এবং টাইমস্ট্যাম্প প্রক্রিয়া
muru

1
উল্লেখযোগ্যভাবে উল্লেখ করা যায় যে আপনি যদি এটি ইন্টারেক্টিভভাবে করছেন, আপনি কেবল কয়েকবার এন্টার কীতে চাপতে পারেন। :)
ওয়াইল্ডকার্ড

উত্তর:


12

উদাহরণস্বরূপ আপনি হাতের মাধ্যমে সর্বদা tail -f(ভালভাবে এখানে, যদি আপনি কোনও অসুবিধা না করেন তবে এর seek()মতো আরও কার্যকর করেন ) প্রয়োগ করতে পারেন :tail -n +1 -fperl

perl -e '
  $| = 1;
  # seek STDIN, 0, 2; # uncomment if you want to skip the text that is
                      # already there. Or if using the ksh93 shell, add
                      # a <((EOF)) after < your-file
  while (1) {
    if ($_ = <STDIN>) {
      print; $t = 0
    } else {
      print "\n"            if $t == 3;
      # and a line of "-"s after 10 seconds:
      print "-" x 72 . "\n" if $t == 10;
      sleep 1;
      $t++;
    }
  }' < your-file

অথবা 3 সেকেন্ডের জন্য কোনও ইনপুট না থাকলে নতুন লেলাইন সন্নিবেশ করানোর জন্য লেজু করা tail -fএবং ব্যবহার perlকরতে দিন :

tail -f file | perl -pe 'BEGIN{$SIG{ALRM} = sub {print "\n"}} alarm 3'

তারা ধরে নেয় যে আউটপুটটি নিজেই ধীর হয় না (যেমন যখন আউটপুটটি কোনও পাইপে যায় যা সক্রিয়ভাবে পড়া হয় না)।


দ্বিতীয়টি আসলে
কীভাবে

আমি প্রথমটি চেষ্টা করেছি, এবং এটি হাতের আগে সমস্ত ফাইল মুদ্রিত করেছে, তাই এটি অনুকূল নয়। দ্বিতীয়টি একটি কবজির মতো কাজ করে। আমি "লেজ -n 0 -f $ 1 |" যুক্ত করেছি ফাইলগুলির পুরানো লাইনগুলি প্রদর্শন করা এড়ানোর জন্য বিকল্প (-n 0)
সিড্রিক

ছোট প্রশ্ন: আমি 10 সেকেন্ড পরে ড্যাশগুলির একটি অতিরিক্ত লাইন (-------) প্রদর্শিত দ্বিতীয় সমাধানটি কীভাবে সংশোধন করতে পারি? (আমি একাধিক উপায়ে চেষ্টা করেছি, তবে কিছুই করতে পারি না)
সিড্রিক

1
@ সিড্রিক, আপনার প্রথম পয়েন্টের জন্য সম্পাদনা দেখুন। আপনার দ্বিতীয় প্রয়োজন প্রথম পদ্ধতির মাধ্যমে আরও সহজ হবে।
স্টাফেন চেজেলাস

8

bash+ + dateসমাধান:

while IFS= read -r line; do        
    prev=$t         # get previous timestamp value
    t=$(date +%s)   # get current timestamp value
    [[ ! -z "$prev" ]] && [[ "$((t-prev))" -ge 3 ]] && echo ""
    echo "$line"    # print current line
done < <(tail -f error.log)

বাশে, আপনি $SECONDSসময়ের ব্যবধান গণনা করতে ব্যবহার করতে পারেন । আমি মনে করি যে শেলটি শুরু হওয়ার পরে এটি সেকেন্ডের সংখ্যা, কোনও পার্থক্য নেওয়ার সময় এটি গুরুত্বপূর্ণ নয়।
ইল্কাচ্চু

@ilkkachu, অথবা read -tবা $TMOUT$SECONDSভেঙে গেছে bashএবং mkshtime bash -c 'while ((SECONDS < 3)); do :; done'2 এবং 3 সেকেন্ডের মধ্যে স্থায়ী হবে। পরিবর্তে এখানে (সহ typeset -F SECONDS) zsh বা ksh93 ব্যবহার করা ভাল
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস, আমি মনে করি এটি ব্যবহারের চেয়ে আলাদা কিছু নয় date +%s। উভয়ই পুরো সেকেন্ডে সময় দেয়, যার ফলে, 1.9 থেকে 4.0 অবধি ব্যবধানটি 3 পূর্ণ সেকেন্ডের মতো দেখায়, যদিও এটি সত্যই 2.1। আপনি যদি ভগ্নাংশের সেকেন্ডগুলিতে অ্যাক্সেস না করতে পারেন তবে এটির পক্ষে কাজ করা শক্ত। তবে হ্যাঁ, ব্যস্তলুপিংয়ের পরিবর্তে তাদের সম্ভবত এখানে ঘুমানো উচিত, এবং read -tঠিক তখনই এটি ব্যবহার করা যেতে পারে। এমনকি যদি আপনি ম্যানুয়ালি ঘুম time bash -c 'while [[ $SECONDS -lt 3 ]]; do sleep 1; done'করেন তবে ঠিকঠাক কাজ করে।
ইল্কাচ্চু

1
ksh93 এবং zsh এর সাথে ঠিক আছে (zsh এর সাথে ব্যবহার করা হয়নি)। এমনকি পূর্ণসংখ্যা $ সেকেন্ডস সহ, সেটিংটি SECONDS=0নিশ্চিত করে যে $SECONDSঠিক 1 সেকেন্ডে 1 এ পৌঁছাবে। যে সঙ্গে কেস না bashএটি ব্যবহার করে যেমন time()ট্র্যাক করতে $SECONDSপরিবর্তে gettimeofday()। আমি কিছুক্ষণ আগে mksh, zsh এবং বাশকে বাগগুলি জানিয়েছিলাম, কেবল zsh ঠিক করা হয়েছিল। (সমস্যাটি একইরকম হওয়ার বিষয়ে ভাল বিষয় date +%s)। মনে রাখবেন এটি কোনও ব্যস্তলুপ নয়, কারণ আমরা tail -fপাইপের উপর দিয়ে আউটপুটটি পড়ছি ।
স্টাফেন চেজেলাস

+1 এবং ব্যাশ একটি "শর্টকাট" ব্যবহার হয়েছে বিল্ট-ইন printfঅনুকরণ dateবহিরাগত টুলস বা কমান্ড প্রতিকল্পন ছাড়া: printf -v t '%(%s)T' -1
ডেভিড ফোস্টার

6

Pythonসমাধান (গতিশীল সময় ফাঁক যুক্তি সহ):

tailing_by_time.py লিপি:

import time, sys

t_gap = int(sys.argv[1])    # time gap argument
ts = 0
while True:
    line = sys.stdin.readline().strip()    # get/read current line from stdin
    curr_ts = time.time()                  # get current timestamp
    if ts and curr_ts - ts >= t_gap:
        print("")                          # print empty line/newline
    ts = curr_ts
    if line:
        print(line)                        # print current line if it's not empty

ব্যবহার:

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