Procura uma string entre dois timestamps a partir da parte inferior do arquivo

0

Eu estava tentando encontrar uma string Cannot proceed: the cube has no data em um enorme arquivo test.txt somente entre os timestamps de ontem, das 22h30 às 00h30 da manhã.

Script:

tac test.txt | awk -v today=$(date "+%d") -v yesterday=$(date "+%d" -d yesterday) '/Cannot proceed: the cube has no data/ {f=$0; next} f{if (($3==yesterday && $4>"22:30:00") || ($4==today && $4<="00:30:00")) {print; print f} f=""}'

test.txt:

[Thu Jun  8 07:56:17 2014]Local/data///47480280486528/Info(1019022)
Writing Database Mapping For [data]

[Thu Jun  8 12:56:38 2014]Local/data///47480280486528/Info(1250008)
Setting Outline Paging Cachesize To [8192KB]

[Thu Jun  8 22:56:20 2014]Local/data///47480280486528/Info(1013202)
Cannot proceed: the cube has no data 

[Thu Jun  8 23:26:18 2014]Local/data///47480280486528/Info(1013205)
Received Command [Load Database]

[Thu Jun  9 00:16:23 2014]Local/data///47480280486528/Info(1019018)
Writing Parameters For Database 

[Thu Jun  9 00:21:20 2014]Local/data///47480280486528/Info(1013205)
Writing Parameters For Database 

[Thu Jun  9 00:29:00 2014]Local/data///47480280486528/Info(1013205)
Cannot proceed: the cube has no data

[Thu Jun  9 01:25:21 2014]Local/data///47480280486528/Info(1019018)
Cannot proceed: the cube has no data 

saída:

[Thu Jun  8 22:56:20 2014]Local/data///47480280486528/Info(1013202)
Cannot proceed: the cube has no data

Por que nem todas as strings que correspondem aos requisitos estão chegando na saída? o que eu sinto falta aqui?

    
por Sunny 09.06.2014 / 13:11

1 resposta

1

Não estou familiarizado com awk e, por isso, não posso oferecer conselhos específicos sobre suas operações, mas tenho certeza de que isso funcionaria:

tac ./file |
sed -e "/$(date -d"2 days ago")/q" -e \
    '/Cannot proceed: the cube has no data/!d;h;n;G'

Se você ler um arquivo para trás com tac , seu erro de destino deve aparecer primeiro, com a linha de tempo seguinte. Por isso, h olds a última linha depois de encontrar o alvo, puxa o próximo e acrescenta o último ao fim - efetivamente reordenando-os.

Ele d elimina todas as outras linhas.

Continua a pesquisa até encontrar uma data com dois dias de antiguidade, quando apenas q uits.

    
por 09.06.2014 / 14:24