Я пытаюсь заменить время в файле журнала:
cat mlog.log | sed -e "s/^[0-9\.]*/\$(date -d @&)/"
Почему это всегда сначала выполняется $(date -d $&)
но выполнение замены сначала и затем выполняет команду?
Я думал, что это будет похоже:
date -d @121223232
Журнал похож на это:
1428688532.169 peerdiff 2
1428688534.269 peerdiff 1
Если mlog.log является разделенным пространством:
cat mlog.log |perl -a -ne 'chomp($F[0]=`date -d \@$F[0] +%FT%T`); print join(" ",@F)."\n"'
, Если mlog.log является разделенной вкладкой:
cat mlog.log |perl -a -F"\t" -ne 'chomp($F[0]=`date -d \@$F[0] +%FT%T`); print join("\t",@F)."\n"'
Причина, почему это работает как это, состоит в том, как оболочка работает. Сначала это начинает интерпретировать все, что это может. Т.е. это интерпретирует то, что находится в "кавычках. Это не интерпретирует то, что находится в 'кавычках. Попытайтесь соответствовать echo "$(date)"
echo '$(date)'
. Если Вы хотите сделать то, что Вы хотите Вас, должен использовать другой подход, например, использовать:
awk '{ system("echo `date -d @"$1"` "$2" "$3);}' < mlog.log
Т.е. заставляют awk разделить файл на столбцы и выполниться, система управляют, чтобы Вы питались столбцами по мере необходимости. Вы не можете использовать sed тот же путь, потому что sed s команда не имеет никакой возможности назвать команду оболочки.