web-dev-qa-db-ja.com

tail -f、ログが3秒間アイドル状態になった後に改行を挿入しますか?

tail -f error.log、何も3秒間ファイルに追加されていない後にプログラムで改行を挿入する方法は?

(明らかに、1つの改行が追加されたら、テキストの他の行がログファイルに追加されるまで、他の改行を追加しないでください)

たとえば、これらの行はerror.logに追加されます。

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

これはコンソールの出力です:

foo
bar
boo

2far
2foo
2bar
2boo

2far
14
Cedric

Perlを手動で使用して、tail -fを常に実装することができます(ここでは、seek()のコメントを外さない限り、tail -n +1 -fのようにファイル全体をダンプします)。

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'

これらは、出力自体が遅くならないことを前提としています(出力がアクティブに読み取られていないパイプに送られる場合など)。

12

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)
8
RomanPerekhrest

Python解(動的time gap引数を使用):

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
6
RomanPerekhrest