Extrai entradas de um arquivo que varia de uma data para outra

1

Existe um arquivo que possui entradas com o primeiro e o segundo campo como data e hora da seguinte maneira: 2015/10/14 00:33:37 .

O arquivo tem mais de 100.000 linhas e é constantemente atualizado. As entradas no arquivo precisam ser selecionadas da segunda-feira às 00:00:00 de domingo até às 23:59:59 de domingo.

2015/10/11 23:55:37 abc1 def1 2015/10/11 23:55:39 abc2 def2 2015/10/11 23:56:19 abc3 def3 2015/10/11 23:56:46 abc4 def4 2015/10/11 23:57:46 abc5 def5 2015/10/12 0:04:25 abc6 def6 2015/10/12 0:04:44 abc7 def7 2015/10/12 0:04:44 abc8 def8 2015/10/12 0:04:44 abc9 def9 2015/10/12 0:04:44 abc10 def10 2015/10/12 0:04:44 abc11 def11 2015/10/12 0:04:44 abc12 def12 2015/10/12 0:04:44 abc13 def13 2015/10/12 0:04:44 abc14 def14 2015/10/12 0:04:44 abc15 def15 2015/10/12 0:04:48 abc16 def16 2015/10/12 0:04:48 abc17 def17 2015/10/12 0:04:48 abc18 def18 2015/10/12 0:04:48 abc19 def19 2015/10/12 0:04:49 abc20 def20 2015/10/12 0:04:49 abc21 def21 2015/10/12 0:08:36 abc22 def22 2015/10/12 0:08:36 abc23 def23 2015/10/12 0:08:36 abc24 def24 2015/10/12 0:08:36 abc25 def25 2015/10/12 0:08:36 abc26 def26 2015/10/12 0:08:36 abc27 def27 2015/10/12 0:08:36 abc28 def28 2015/10/12 0:08:37 abc29 def29 2015/10/12 0:08:37 abc30 def30

    
por Cartwig 06.11.2015 / 05:19

1 resposta

2

Este fragmento de script de shell cria uma expressão regular estendida (com / caracteres adequadamente escapados) que contém todos os dias da última segunda-feira até o domingo seguinte, em YYYY/MM/DD format. Em seguida, ele usa isso com grep para procurar o arquivo de log.

DAYS=$(for D in {0..6} ; do 
           date -d "last monday + $D days" +'%Y\/%m\/%d'
       done | xargs | 
       sed -e 's/ /|/g'
      )

REGEX="^($DAYS) "

grep -E "$REGEX" logfile.txt

Se você preferir usar expressões regulares básicas, altere as últimas linhas para:

REGEX="^\($DAYS\) "
REGEX=$(printf "%s" "$REGEX" | sed -e 's/\([|]\)/\/g')

grep "$REGEX" logfile.txt

Outra opção é usar as opções grep -F (cadeia fixa) e -f (arquivo) com a capacidade de substituição de processo <( ... ) do shell, desta forma:

DAYS=$(for D in {0..6} ; do 
           date -d "last monday + $D days" +'%Y/%m/%d'
       done )

grep -F -f <(echo "$DAYS") logfile.txt

ou até mesmo

grep -F -f <( for D in {0..6} ; do 
              date -d "last monday + $D days" +'%Y/%m/%d'
              done ) logfile.txt

NOTA: essas duas últimas versões corresponderão em uma data nesse formato em qualquer lugar da linha, não apenas no início da linha. com a amostra que você deu, isso provavelmente não será um problema.

    
por 06.11.2015 / 05:35

Tags