Preciso das contagens de linhas entre dois padrões correspondentes

1

Eu tenho minha entrada como abaixo -

[11/Jul/2016:13:40:43 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:43 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:47 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:47 +0000] "POST --" 500 - 7
[11/Jul/2016:13:41:48 +0000] "POST --" 200 - 7
[11/Jul/2016:13:41:49 +0000] "POST --" 500 - 7
[11/Jul/2016:13:42:12 +0000] "POST --" 500 - 7

Eu quero o número de linhas entre a entrada 13:40 às 13:41, neste caso uma contagem como 6.

Eu tentei abaixo das opções

echo sed -n '/^START_TIME/,/^END_TIME/ p' somelogfile.log | wc -l

echo sed -n '/^13:40:43$/,/^13:41:43$/ p' somelogfile.log | wc -l

mas eu recebo 1 o tempo todo.

Alguém pode checar e me avisar o que está errado aqui?

    
por user179309 12.07.2016 / 10:09

3 respostas

2

O echo vai gerar apenas uma linha e wc está contando essa linha.

Observe que o timestamp final não existe 13:41:43 e as âncoras usadas ( ^ e $ ) são muito restritivas.

Remova o echo e tente isto:

sed -n '/13:40:43/,/13:41:49/p' somelogfile.log | wc -l
    
por 12.07.2016 / 10:33
1

Se a ordem cronológica for igual à ordem lexical que você pode fazer:

awk '$0>="[11/Jul/2016:13:40:00" && $0<="[11/Jul/2016:13:41:59"' file | wc -l

Isso verifica se o valor é maior ou igual à primeira data e menor ou igual à segunda data. Se em awk nenhum comando for dado, awk apenas imprime a linha.

    
por 12.07.2016 / 10:29
1

Vamos rever este comando:

echo sed -n '/^13:40:43$/,/^13:41:43$/ p' somelogfile.log | wc -l
  • Considere o que o echo faz e o que passa pelo canal para wc (apenas tente sem wc ). Isso explica porque você sempre recebe um 1 .

  • Os regexes que você escreveu estão bloqueados para o início ^ e terminam $ da linha, mas é claro que esses carimbos de data e hora não são a única coisa na linha, portanto você deve remover as âncoras. / p>

  • A condição final procura um registro de data e hora que não esteja presente em sua amostra, portanto, o intervalo de correspondência nunca terminará, imprimindo tudo a partir da primeira correspondência.

Algo parecido com isso pode fazer aproximadamente o que você pede (exibindo 3 com o arquivo de entrada mostrado atualmente na pergunta)

sed -ne '/13:40:47/,/13:41:48/p' somelogfile.log | wc -l
    
por 12.07.2016 / 10:33