sed 使用替换模式作为参数来执行替换命令

sed 使用替换模式作为参数来执行替换命令

我正在尝试通过以下方式替换日志文件中的时间:

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

为什么它总是先执行$(date -d $&)但不先进行替换然后再执行命令?

我以为会是这样的:

date -d @121223232

日志如下所示:

1428688532.169   peerdiff 2
1428688534.269   peerdiff 1 

答案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"'

答案2

它之所以这样工作,是因为 shell 的工作方式。首先,它开始解释它能解释的一切。即,它解释 " 引号中的内容。它不解释 ' 引号中的内容。尝试与 进行比较echo "$(date)"echo '$(date)'如果你想做你想做的事情,你必须使用另一种方法,例如使用 :

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

即让 awk 将文件拆分为列并根据需要执行您输入列的系统命令。您不能以同样的方式使用 sed,因为 sed s 命令没有调用 shell 命令的能力。

答案3

GNU sed 有““ 命令哪个:

将 shell 命令的输入通过管道传输到模式空间

对于您的日志:

cat mlog.log | sed -r 's/^([0-9\.]+)/echo `date -d @\1`/e'
2015-04-10T19:55:32+02:00 peerdiff 2
2015-04-10T19:55:34+02:00 peerdiff 1

相关内容