我有一个日志文件,其中的每一行都是:
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位数时间戳代替,而是始终将其视为数字1
。谁能告诉我如何解决这个问题?提前谢谢!
答案 0 :(得分:3)
awk -F, '{x=$1;sub(/.*=/,"",$1);sub(/=.*/,strftime("=%Y-%m-%d %H:%M:%S",$1),x);$1=x;}1' OFS=, file
示例结果:
$ cat file
timestamp=1356431101, entity=xxx, event: xxxxxx
timestamp=1354770380, entity=xxx, event: xxxxxx
运行命令时:
$ 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
第一个sub
命令提取时间戳。使用strftime
的第二个用时间戳替换日期和时间。 1
用于打印每一行。
答案 1 :(得分:2)
试
cat test.txt | sed 's/^/echo "/; s/\([0-9]\{10\}\)/`date -d @\1`/; s/$/"/' | bash
答案 2 :(得分: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
答案 3 :(得分: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]*)/...