带有参考日期的评估日期命令的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
之外。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...