Alguém pode explicar por que essa correspondência de padrão não está funcionando usando sed

2

Tentando imprimir horários específicos de registros com base na recomendação do este tópico do superusuário. Não tenho certeza porque meus padrões não estão sendo correspondidos por sed. Eu tenho a data e a hora da amostra que estou usando aqui colado. Se eu usar

sed -n '/2014-03-27 07:00:00/ , /2014-03-27 11:25:00/p' log-file-name

Espero imprimir todas as linhas que coincidam entre as 7 da manhã e as 11 da manhã. Mas eu recebo zero partidas. Se eu remover "-n", imprime as linhas inteiras das 3h às 16h14 como resultado. Eu tentei tweaking o comando sed acima com aspas simples e duplas e tentei diferentes opções de espaçamento. Mas os resultados são sempre "todos ou nenhum". Alguém pode explicar por que o sed não está imprimindo as linhas da janela da hora que estou pedindo para imprimir?

    
por user2476714 13.04.2014 / 06:37

3 respostas

1

Você está tentando usar o sed com o recurso de início e interrupção do padrão.

Portanto, se uma linha correspondente ao seu primeiro padrão (inicial) for encontrada, a saída será retornada até que uma linha correspondente ao segundo padrão (de parada) seja encontrada.

Se a linha de partida não estiver exatamente presente no seu arquivo, você não obterá resultados.

Remover o sinalizador -n das suas opções significa que todas serão impressas, mesmo que não correspondam ao seu padrão. Usar sed com -n '/.../p' fará com que ele se comporte como grep.

Encontrei um tutorial útil aqui

Para o seu caso, você pode considerar um padrão como:

\d{4}-\d{2}-\d{2} ((0[7-9])|(1[0-1])):\d{2}:\d{2},\d{3}

O que precede coincide com todos os horários, das 07:00 às 11:59. algumas explicações:
\d{4} = match 4 digits (year, eg. 2014)
(0[7-9]) = match 07 - 09 e | = OR e (1[0-1]) = match 10 -11

    
por 13.04.2014 / 08:27
0

O Unix é incrível em fazer pequenas coisas, não as torne muito longas. Isso pega o awk do post vinculado e adiciona um pipe de data.

Isso encontra todas as datas no início da linha com 2014-03-27, pega essa saída e encontra todos os tempos com horas (segundo campo) maior ou igual a 7 e menor que 11.

grep ^2014-03-27 log-file | awk -F'[: ]' '$2 >= 7 && $2 < 11 { print }'
    
por 14.04.2014 / 15:48
0

Será complicado usar o regex. Talvez algo assim faça:

awk '$1 FS $2>=s{p=1} $1 FS $2>e{exit}p' s="2014-03-27 07:00:00" e="2014-03-27 11:25:00" file

Explicação:

awk '
  $1 FS $2>=s{     # '$1 FS $2' is the string the consists of field 1, a space, 
                   # and field 2. If it is larger or equal (string comparison) 
                   # to the variable s, then: 
    p=1            # set a variable p to 1
  }
  $1 FS $2>e{      # if the string $1 FS $2 is larger than variable e, then
    exit           # exit the script ( stop processing the file )
  }
  p                # if variable p is equal to 1 then print the record (line)
' s="2014-03-27 07:00:00" e="2014-03-27 11:25:00" file    
                   # line above: set variables p and s and specify file name

$1 FS $2 é a cadeia que consiste no campo 1, um espaço e o campo 2. Se for maior ou igual (comparação de cadeia) à variável s, defina uma variável p para 1

    
por 13.04.2014 / 18:36