Como remover carimbos de hora de um arquivo?

1

Eu tenho log que contém linhas de dados:

Mon Apr 20 03:15:18 EDT 2015: my|data|data|data

Estou tentando escrever um script que extraia apenas os dados de o log, removendo os carimbos de hora iniciais:

while read p
do
   echo $p | sed "s/.* EDT $year: //g" > replay_message_$count.txt;
   count=$((count+1));
done < $fileName

Neste momento, estou usando o padrão .* EDT $year: , em que $year é um parâmetro passado pelo usuário.

O que seria uma maneira de extrair os dados sem ter que passar o ano como parâmetro?

    
por Sas 21.04.2015 / 23:20

2 respostas

2

Se você souber que o formato de data sempre terá seis campos separados por espaço, poderá usar:

cut -d ' ' -f 7-

Se você souber que seu carimbo de data / hora sempre ocupa 30 caracteres, pode usar:

cut -c 31-

Se você sabe que seus carimbos de hora terminam com um dígito, seguido por um dois pontos, seguido por um espaço e que seus dados não incluem este padrão, você pode usar:

sed 's/.*[0-9]: //'

Se você tiver requisitos mais específicos, você pode mencioná-los.

    
por 21.04.2015 / 23:28
0

Pretende substituir todo o ciclo while no seu script:

awk '{print substr($0, 31)>("replay_message_" NR-1 ".txt")}' file

Como funciona:

  • print substr($0, 31)

    Isto imprime todos menos os primeiros trinta caracteres da linha.

  • >("replay_message_" NR-1 ".txt")

    Isso envia o que foi impresso em um arquivo com o nome do número da linha.

Quando o comando awk terminar a execução, haverá uma série de arquivos em seu diretório, como:

$ ls -1 replay_message*
replay_message_0.txt
replay_message_1.txt
replay_message_2.txt
replay_message_3.txt

Alternativa caso o tamanho do timestamp varie

awk '{sub(/.* E[SD]T [[:digit:]]{4}: /, ""); print >("replay_message_" count++ ".txt")}' file

Como funciona

o awk lê implicitamente um arquivo de um registro (linha) por vez. Para cada linha:

  • sub(/.* EDT [[:digit:]]{4}: /, "")

    Isso remove o timestamp do início da linha.

    A regex corresponde a tudo até um espaço, o fuso horário (EST ou EDT), um espaço, quatro dígitos para o ano, dois pontos e um espaço.

    Como alternativa, se fosse garantido que seu timestamp leva apenas 30 caracteres, uma substituição mais simples poderia ser usada:

    sub(/.{30}/, "")
    

    Com base nos seus arquivos de entrada, você terá que decidir o que melhor se adapta à sua situação.

  • print >("replay_message_" count++ ".txt")

    Isso grava a linha modificada em um arquivo que inclui um count number. O ++ faz com que count seja incrementado com cada gravação.

por 22.04.2015 / 02:50

Tags