3

我有一个日志文件,其中的每一行都像:

timestamp=1356431101, entity=xxx, event: xxxxxx

现在我想使用 sed 用人类可读的日期时间替换时间戳:

timestamp=2012-12-24 10:00:00, entity=xxx, event:xxxxx

我的命令是:

sed "s/^timestamp=\([0-9]\{10\}\),/timestamp=\`date +%D --date=@\1\`,/"

但问题是\1不能用 10 位时间戳代替,而是始终将其视为 digit 1。谁能告诉我如何解决这个问题?先感谢您!

4

4 回答 4

4

尝试

cat test.txt | sed 's/^/echo "/; s/\([0-9]\{10\}\)/`date -d @\1`/; s/$/"/' | bash
于 2017-01-13T07:51:21.627 回答
3

awk is better for these stuff, if acceptable:

awk -F, '{x=$1;sub(/.*=/,"",$1);sub(/=.*/,strftime("=%Y-%m-%d %H:%M:%S",$1),x);$1=x;}1' OFS=, file

A sample result:

$ cat file
timestamp=1356431101, entity=xxx, event: xxxxxx
timestamp=1354770380, entity=xxx, event: xxxxxx

On running the command:

$ awk -F, '{x=$1;sub(/.*=/,"",$1);sub(/=.*/,strftime("=%Y-%m-%d %H:%M:%S",$1),x);$1=x;}1' OFS=, file
timestamp=2012-12-25 15:55:01, entity=xxx, event: xxxxxx
timestamp=2012-12-06 10:36:20, entity=xxx, event: xxxxxx

The first sub command extracts the timestamp. The second using the strftime replaces the timestamp with the date and time. 1 is used to print every line.

于 2012-12-26T05:07:45.980 回答
1

时间戳操作最好使用更现代的编程语言完成,例如 Perl 或 Ruby。但是,如果您有 GNU awk,则可以使用以下strftime()函数执行此操作:

awk '{ sub(/[0-9]{10}/, strftime("%Y-%m-%d %H:%M:%S", substr($0,11,10))) }1' file

结果:

timestamp=2012-12-25 20:25:01, entity=xxx, event: xxxxxx

您还可以在此处阅读有关 GNU awk 时间函数的更多信息:

http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html

于 2012-12-26T07:04:44.500 回答
1

我实际上更喜欢这种awk方法,但为了完整起见,perl解决方案如下所示:

perl -Mposix -pe 's/([0-9]{10})/POSIX::strftime( "%Y-%m-%d %H:%M:%S", gmtime($1))/eg'

如果你想匹配前导的“timestamp=”来限制替换(尽管这似乎没有必要给样本输入),你可以使用:'s/(?:timestamp=)([0-9]*)/...

于 2012-12-26T11:04:50.037 回答