Com o awk :
awk -v RS='[[:alpha:]]{3} [[:alpha:]]{3} [0-9]{1,2} ([0-9]{2}:?){3} [0-9]{4}:' \
-v ORS='' '{print}' datafile
NOF DOWN BITS = 96 data = 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E
nof_received_data_packets
Isso funciona configurando o Record Separator (RS) como uma expressão regular que corresponda a strings que se parecem com uma data & tempo seguido por um :
e definindo o ORS (Output Record Separator) para esvaziar.
Em seguida, apenas imprime cada "registro".
Funciona com qualquer data & tempo, supondo que apenas os nomes curtos do Mês e os nomes curtos do Dia tenham sempre três letras, e que o formato da data seja sempre Day Month Daynum HH:MM:SS YYYY
.
com sed :
sed -E 's/[[:alpha:]]{3} [[:alpha:]]{3} [0-9]{1,2} ([0-9]{2}:?){3} [0-9]{4}://g' \
datafile
Isso usa a mesma regex de correspondência de data para remover tudo o que parece uma data & tempo seguido por :
.
Com perl :
perl -p -e 's/\w{3} \w{3} \d{1,2} (\d{2}:?){3} \d{4}://g' datafile
expressões regulares perl possuem alguns atalhos para especificar caracteres "word" ( \w
) e dígitos ( \d
). A versão perl é compatível com unicode e deve funcionar em qualquer localidade.
Todos os três são scripts de força bruta. Não creio que valha a pena tentar algo mais sofisticado do que isso, a menos que o formato de data provavelmente variasse do acima. Se esse fosse o caso, eu provavelmente escreveria algo em perl para escanear substrings de cada linha usando o módulo Date::Parse
.
As versões sed
e awk
requerem o GNU sed
e o GNU awk
, ou pelo menos versões deles que entendem as contagens de repetição de expressões regulares {n,m}
.