Como ajustar um arquivo de log por tempo?

4

Digamos que meu arquivo de log (log.txt) é algo como

2014-01-01 22:30:30 something happened....
2014-01-01 22:30:31 something happened....
2014-01-01 22:30:41 something happened....

Eu quero seguir esse arquivo para mostrar o log da última hora e continuar seguindo o processo.

ou seja,

tail <some magic to specify last 1 hour> -f log.txt

Em seguida, a saída é

2014-01-01 21:30:41 something happened....
...
2014-01-01 22:30:30 something happened....
2014-01-01 22:30:31 something happened....
2014-01-01 22:30:41 something happened....

Existe uma ferramenta para fazer isso?

    
por user40129 06.08.2015 / 19:01

2 respostas

2

Você pode usar apenas a combinação de grep e tail no oneliner.

grep "2014-01-01 21:" log.txt; tail -f log.txt

Ele imprimirá tudo a partir dessa hora e continuará seguindo o processo.

ou você também pode usar o awk para imprimir tudo, desde o início de uma determinada hora até o final do arquivo, e continuar atrás dele, isso permitirá que você siga as últimas horas, se necessário.

awk '/2014-01-01 21:/' log.txt; tail -f log.txt
    
por 06.08.2015 / 19:16
-1
onehourago=$(date --date='1 hours ago' +"%b%e %H:%M:%S") 
echo $onehourago | cat /var/log/auth.log - | sort | sed "1,/$onehourago/d"

Saída intermediária sem o comando sed:

Aug  7 00:00:03 thinkpux CRON[25475]: pam_unix(cron:session): session closed for user stefan
Aug  7 00:17:01 thinkpux CRON[25504]: pam_unix(cron:session): session closed for user root
Aug  7 00:17:01 thinkpux CRON[25504]: pam_unix(cron:session): session opened for user root by (uid=0)
Aug 7 00:19:33
Aug  7 01:00:02 thinkpux CRON[25652]: pam_unix(cron:session): session opened for user stefan by (uid=0)
Aug  7 01:00:03 thinkpux CRON[25652]: pam_unix(cron:session): session closed for user stefan
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session closed for user root
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session opened for user root by (uid=0)

Saída:

Aug  7 01:00:02 thinkpux CRON[25652]: pam_unix(cron:session): session opened for user stefan by (uid=0)
Aug  7 01:00:03 thinkpux CRON[25652]: pam_unix(cron:session): session closed for user stefan
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session closed for user root
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session opened for user root by (uid=0)

Nota: Primeiro eu construí a data com + "% b% e% H:% M:% S" (note o espaço entre% be% e, mas echo comprime dois espaços em um. Pesquisando por sed parece para procurar dois espaços em branco e não encontrar a expressão, por isso é de alguma forma complicado distinguir se o dia do mês tem dois ou um dígito.No entanto, o tipo parece agnóstico sobre o espaço em branco / faltante.Talvez haja um bash-switch para impedir a compressão? No entanto - o seu formato de data é diferente e assim você não será afetado, mas eu tive que testar essa abordagem de alguma forma, e os alunos podem entrar na mesma armadilha.

Portanto, a idéia geral é, para obter a data / hora de 1 hora atrás, formatá-la como no arquivo de log, adicionar a data pura ao arquivo de log e classificar essa mistura e excluir com sed até a data pura.

Não é engraçado lembrar e digitar, mas você pode colocá-lo em um script e / ou função.

    
por 07.08.2015 / 01:39