tail -f, insere quebra de linha após o log ficar inativo por 3 segundos?

13

Ao fazer um tail -f error.log , como inserir programaticamente uma quebra de linha depois que nada foi adicionado ao arquivo por 3 segundos?

(obviamente, uma vez que uma quebra de linha tenha sido adicionada, nenhuma outra quebra de linha deve ser adicionada até que outra (s) linha (s) de texto seja adicionada ao arquivo de log)

Por exemplo, essas linhas são nomeadas para error.log:

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

Esta seria a saída no console:

foo
bar
boo

2far
2foo
2bar
2boo

2far
    
por Cedric 22.02.2018 / 14:14

3 respostas

11

Você sempre pode implementar o tail -f (bem aqui, a menos que descomente o seek() , mais como tail -n +1 -f ao despejarmos o arquivo inteiro) manualmente com perl , por exemplo:

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

Ou deixe tail -f fazer o tailing e use perl para inserir as novas linhas se não houver entrada por 3 segundos:

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

Eles assumem que a saída em si não é retardada (como quando a saída vai para um canal que não é lido ativamente).

    
por 22.02.2018 / 14:31
8
Solução

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)
    
por 22.02.2018 / 14:38
6
Solução

Python (com argumento dinâmico intervalo de tempo ):

tailing_by_time.py script:

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

Uso:

tail -f error.log | python tailing_by_time.py 3
    
por 22.02.2018 / 15:32