Вопрос sed для выполнения команды в качестве замены шаблоном замещения в качестве аргумента


Я пытаюсь заменить время в файле журнала:

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

Почему он всегда выполняется первым $(date -d $&) но сначала не выполнять замену, а затем выполнить команду?

Я думал, что это будет так:

date -d @121223232

Журнал выглядит следующим образом:

1428688532.169   peerdiff 2
1428688534.269   peerdiff 1 

2
2018-04-10 21:26


происхождения


извините - \ $ была опечатка. я пробовал с ним раньше - user2700517


ответы:


Если 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"'

1
2018-04-11 09:43



спасибо! Я написал более полный скрипт, используя ваш скрипт - cat mlog.log | perl -an -F "\ n" -e 'if ($ F [0] = ~ /^[0-9\.]{8,}/){my @ a = split (/ ^ ([0-9 \.] {8,}) (. *) /, $ F [0]); грызть ($ а [1] =date -d \@$a[1] +"%F %T"); print $ a [1]. $ a [2]} else {print $ F [0]} напечатать "\ n" ' - user2700517


Причина, по которой это работает, заключается в том, как работает оболочка. Сначала он начинает интерпретировать все, что может. То есть он интерпретирует то, что находится в «цитатах». Он не интерпретирует то, что находится в «цитатах». Попробуйте сравнить echo "$(date)" с echo '$(date)', Если вы хотите сделать то, что хотите, вы должны использовать другой подход, например:

awk '{ system("echo `date -d @"$1"` "$2" "$3);}' < mlog.log

То есть make awk разбивает файл на столбцы и выполняет системную команду, которую вы кормите колонками по мере необходимости. Вы не можете использовать sed таким же образом, потому что команда sed не может вызывать команду оболочки.


0
2018-04-25 17:54