O motivo pelo qual o comando sed não funciona é que ele pressupõe que você tenha uma data em todas as linhas, o que não é o caso se algumas linhas vierem de mensagens de erro de várias linhas. Quando não há nada que corresponda ao padrão de substituição, o sed não substitui e as listagens de pilha de chamadas que você viu permanecem na saída.
Para obter apenas as datas das linhas que as têm no começo, você tem várias opções:
grep:
grep -Eo '^[0-9.]+' fac.log
-o diz ao grep para imprimir apenas a parte correspondente, em vez da linha inteira, e -E ativa expressões regulares "estendidas"
awk:
awk '/^[0-9.]+/ {print $1}' fac.log
A primeira parte do comando awk é uma correspondência de expressão regular, o resto é o que fazer com uma linha correspondente, aqui imprimimos a primeira palavra na linha.
Perl:
perl -lne 'print $1 if /^([0-9]+)/' fac.log
-l: imprime uma nova linha em cada print
, -n: executa o comando para cada linha de entrada (como awk), -e: apenas informa que o programa é fornecido na linha de comando e não em um arquivo .
Em todos os casos, você obtém uma linha de saída por linha de entrada correspondente, ou seja, datas de repetição. Piping o resultado através de | sort | uniq
é provavelmente o idioma mais simples para remover duplicatas.
Note que eu era preguiçoso e usei ^[0-9.]+
em vez do padrão mais longo e exato. Isso está relacionado ao motivo pelo qual eu gosto de usar o perl ao invés do sed, do awk e dos amigos: a expressão regular do Perl é sempre a mesma, independentemente do que você está fazendo. Também em Perl, não há necessidade de lembrar quais modificadores são suportados por padrão e quais requerem configuração -E ou o que for. Então há as diferenças entre as versões: aparentemente, meus sistemas Debian têm o mawk ao invés do GNU awk por padrão, e não parece suportar o modificador {N}, então o padrão mais exato não funcionou. Ops.
Manual do GNU awk: "As expressões de intervalo não estavam tradicionalmente disponíveis no awk. Elas foram adicionadas como parte do padrão POSIX para tornar o awk e o egrep consistentes entre si." (ref. link )