5

Centos / Linux Bash

我有一个日志文件,里面有很多文本和时代编号。我想将所有时代替换为可读的日期/时间。

我一直想通过 sed 来做这件事,因为这似乎是这项工作的工具。我似乎无法让 sed 的替换部分实际解析变量(纪元)以进行转换。

我正在使用的示例...

echo "Some stuff 1346474454 And not working" \
| sed 's/1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/'"`bpdbm -ctime \&`"'/g'
Some stuff 0 = Thu Jan  1 01:00:00 1970 And not working

bpdbm 部分会将提供的 epoch 变量转换为有用的日期。像这样..

bpdbm -ctime 1346474454
1346474454 = Sat Sep  1 05:40:54 2012

那么我如何将“找到”的项目解析为命令。因为我似乎无法让它工作。

任何帮助都会很可爱。如果有另一种方式,那会很酷......但我怀疑 sed 会最快。

谢谢你的时间!

4

2 回答 2

7

这似乎是工作的工具

不它不是。sed只能使用&它自己,没有办法让它成为命令的参数。你需要更强大的东西,例如 Perl:

perl -pe 'if ( ($t) = /(1[0-9]+)/ ) { s/$t/localtime($t)/e }'
于 2012-09-05T16:51:36.410 回答
1

你可以用 GNU sed 来做,输入:

文件

Some stuff 1346474454 And not working

GNU sed 支持/e允许将命令输出通过管道传输到模式空间的参数,这是利用这一点的一种方法bpdbm

sed 's/(.*)(1[0-9]{9})(.*)/echo \1 $(bpdbm -ctime \2) \3/e' infile

或与coreutils date

sed 's/(.*)(1[0-9]{9})(.*)/echo \1 $(date -d @\2) \3/e' infile

输出日期

Some stuff Sat Sep 1 06:40:54 CEST 2012 And not working

要获得与 相同的输出bpdbm

sed 's/(.*)(1[0-9]{9})(.*)/echo "\1$(date -d @\2 +\"%a %b %_d %T %Y\")\3"/e' infile

输出

Some stuff Sat Sep  1 06:40:54 2012 And not working

请注意,这仅替换在一行中找到的最后一个 epoch。如果还有更多,请重新运行。

于 2012-09-06T07:36:54.700 回答