如何解决带有参考日期的评估日期命令的sed打印
| 我有一个文件(通常是这样),日期以* nix时间为单位,距大纪元为秒,接着是一条消息和一个我想选择的最终“线程”字段。从sqlite数据库中导出的所有内容都以\'| \'分隔... 例如1306003700|SENT|21
1277237887|SENT|119
1274345263|SENT|115
1261168663|RECV|21
1306832459|SENT|80
1306835346|RECV|80
基本上,我可以轻松地使用sed来选择和打印与\“ thread \”字段匹配的行,并使用消息打印相应的时间,因此:
> cat file | sed -n \"s/^\\([0-9]*\\)\\|\\(.*\\)\\|80$/\\1 : \\2/p\"
1306832459 : SENT
1306835346 : RECV
但是我真正想做的是也通过unix date命令传递时间字段,因此:
> cat file | sed -n \"s/^\\([0-9]*\\)\\|\\(.*\\)\\|80$/`date -r \\1` : \\2/p\"
但这似乎不起作用-即使它似乎接受了它。它只是打印出相同的(大纪元开始)日期:
Thu 1 Jan 1970 01:00:01 BST : SENT
Thu 1 Jan 1970 01:00:01 BST : RECV
我如何/可以对date命令求反引用\\ 1?
也许sed不是匹配这些行的方法(一次性格式化输出)...
解决方法
Perl在这里很方便:
perl -MPOSIX -F\'\\|\' -lane \'
next unless $F[2] == \"80\";
print(strftime(\"%Y-%m-%d %T\",localtime $F[0]),\" : \",$F[1])
\' input.file
, awk对此很完美。
awk -F\"|\" \'$3 == \'80\' { print system(\"date -r \" $1),\":\",$2 }\' myfile.txt
应该可以。(虽然不能保证系统调用正确,但是没有测试)
, 这个纯扑
wanted=80
(IFS=\\|; while read sec message thread
do
[[ $thread == $wanted ]] && echo $(date -r $sec) : $message
done) < datafile.txt
打印
Tue May 31 11:00:59 CEST 2011 : SENT
Tue May 31 11:49:06 CEST 2011 : RECV
您可以在\“ \”中引用变量以提高安全性...
, 这可能对您有用:
sed -n \'s/^\\([0-9]*\\)|\\(.*\\)|80$/echo \"$(date -d @\\1) : \\2\"/p\' file | sh
或如果您已使用GNU sed:
sed -n \'s/^\\([0-9]*\\)|\\(.*\\)|80$/echo \"$(date -d @\\1) : \\2\"/ep\' file
, 使用awk:
$(awk -F\'|\' \'/80$/{printf(\"echo $(date -d @%s) : %s;\",$1,$2);}\' /path/to/file)
, date
命令将在sed
命令之前执行。
打破perl或python来完成这项工作可能是最简单的,否则您可以使用某种bash循环。
, 受到Rafe的上述回答的启发:
awk -F\"|\" \'$3 == \'80\' { system(\"date -d @\" $1 \" | tr -d \\\"\\n\\\"\"); print \" :\",$2 }\' myfile.txt
对于我的date版本,似乎以-d
作为参数,而不是-r
,并且它需要以前导@
表示。这里的另一个变化是执行系统调用(因此实际上打印,换行以及所有日期都为日期-因此为tr
)并返回退出代码。我们并不是很在意打印退出代码(0),因此我们将system
呼叫移到任何awk
print
之外。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。