pt sed para executar um comando como substituição pelo padrão de substituição como argumento

2

Estou tentando substituir o tempo em um arquivo de log por:

cat mlog.log | sed -e "s/^[0-9\.]*/$(date -d @&)/"

Por que primeiro executar $(date -d $&) , mas não fazer a substituição primeiro e depois executar o comando?

Eu pensei que seria assim:

date -d @121223232

Log se parece com isso:

1428688532.169   peerdiff 2
1428688534.269   peerdiff 1 
    
por user2700517 10.04.2015 / 23:26

2 respostas

1

Se mlog.log é separado por espaço:

cat mlog.log |perl -a  -ne  'chomp($F[0]='date -d \@$F[0] +%FT%T'); print join(" ",@F)."\n"'

Se mlog.log estiver separado por separadores:

cat mlog.log |perl -a -F"\t" -ne  'chomp($F[0]='date -d \@$F[0] +%FT%T'); print join("\t",@F)."\n"'
    
por Ole Tange 11.04.2015 / 11:43
0

A razão por que funciona assim é como o shell funciona. Primeiro, começa a interpretar tudo o que pode. Ou seja ele interpreta o que está em "aspas. Ele não interpreta o que está em 'aspas. Tente comparar echo "$(date)" com echo '$(date)' . Se você quiser fazer o que você quer, você deve usar outra abordagem, por exemplo use:

awk '{ system("echo 'date -d @""' "" ");}' < mlog.log

Ou seja. Faça o awk dividir o arquivo em colunas e execute o comando do sistema que você alimenta com colunas conforme necessário. Você não pode usar o sed da mesma forma porque o comando seds não tem capacidade de chamar o comando shell.

    
por ludvik02 25.04.2016 / 19:54