tail -f, 로그가 3초 동안 유휴 상태인 후 개행 문자를 삽입하시겠습니까?

tail -f, 로그가 3초 동안 유휴 상태인 후 개행 문자를 삽입하시겠습니까?

을 실행할 때 tail -f error.log3초 동안 파일에 아무것도 추가되지 않은 후 프로그래밍 방식으로 개행 문자를 삽입하려면 어떻게 해야 합니까 ?

(분명히 한 줄 바꿈을 추가하면 추가 텍스트 줄이 로그 파일에 추가될 때까지 다른 줄 바꿈을 추가해서는 안 됩니다.)

예를 들어 다음 줄은 error.log에 추가됩니다.

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

콘솔의 출력은 다음과 같습니다.

foo
bar
boo

2far
2foo
2bar
2boo

2far

답변1

언제든지 수동으로 수행할 수 있습니다 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 -ftail 작업을 수행하고 이를 사용하여 줄 바꿈을 삽입합니다.perl

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

이는 출력 자체가 느려지지 않는다고 가정합니다(예: 출력이 적극적으로 읽히지 않는 파이프에 들어갈 때).

답변2

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)

답변3

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

관련 정보