Como pode ler o arquivo no bash a partir do último local de leitura

0

Eu tenho um arquivo de log que é atualizado contunuamente. Eu quero executar o cron job a cada 5 minutos, que ler esse arquivo e executar o comando awk para enviar algumas métricas para o cloudwatch.

Agora só quero ler o arquivo de onde saí na última operação de leitura.

Como posso fazer isso?

    
por Mirage 27.04.2018 / 05:55

1 resposta

2

Você precisaria registrar o deslocamento no final.

Seria mais fácil com o ksh93 ou o zsh que construíram operadores para isso em vez de bash.

Por exemplo, com ksh93:

#! /bin/ksh93
file=/some/file.log
offset_file=$file.offset
offset=$(<"$offset_file")

{
  do-your-processing; ret=$?

  echo "$(<#((CUR)))" > "$offset_file" && exit "$ret"
} < "$file" <#((offset))

com zsh :

#! /bin/zsh
zmodload zsh/system

file=/some/file.log
offset_file=$file.offset
offset=$(<$offset_file)

{
  sysseek offset || exit

  do-your-processing; ret=$?

  echo $((systell(0))) > $offset_file && exit $ret
} < $file

Com bash , você poderia fazer a maioria das opções acima e ligar para ksh93 , zsh ou perl para fazer a pesquisa / declaração:

#! /bin/bash
file=/some/file.log
offset_file=$file.offset
offset=$(<"$offset_file")

seek() {
  OFFSET=$1 perl -e '
    seek(STDIN, $ENV{OFFSET}, 0) || die "seek: $!\n"'
}

tell() {
  perl -le 'print tell(STDIN)'
}

{
  seek "${offset:-0}" || exit

  do-your-processing; ret=$?

  tell > "$offset_file" && exit "$ret"
} < "$file"

Você deseja ter certeza de que sempre que o arquivo for truncado, o arquivo fileoffset será vazio, truncado ou será escrito 0.

    
por 27.04.2018 / 07:58