sed:将表中的时间(3)秒转换为可打印日期(spamdb)
问题描述:
我从spamdb获得以下内容,其中第三个字段表示从Epoch开始的秒数。sed:将表中的时间(3)秒转换为可打印日期(spamdb)
Cns# spamdb | fgrep TRAPPED
TRAPPED|113.163.117.129|1360836903
TRAPPED|113.171.216.201|1360837481
TRAPPED|122.177.159.61|1360844596
TRAPPED|36.231.9.231|1360865649
TRAPPED|37.146.207.209|1360832096
TRAPPED|212.156.98.210|1360837015
TRAPPED|59.99.160.62|1360839785
TRAPPED|86.127.116.162|1360840492
TRAPPED|92.83.139.194|1360843056
TRAPPED|219.71.12.150|1360844704
我想的时候这个表进行排序,并与date -r
打印时间字段,例如它的像样的和明确的,当发生事件。
如何在OpenBSD上的tcsh
中执行此操作?
与sort
排序很容易,编辑sed
也很容易;但我如何使sed
执行date -r
或等效?
答
确实有一些障碍在这里:首先,你基本上必须分开数据,然后其中一部分按原样显示,而另一部分必须传递到date -r
进行日期格式化,呈现给用户。
的另一个障碍是确保输出一致:很显然,这是相当难以处理制表符的外壳,可能只在BSD系统:
另外,由于我们最终将此管道传输至sh
以供执行,因此除管道字符|
以外的其他字段必须使用不同的分隔符。
到目前为止,这是我能拿出最好的片段,似乎在给工作带来极大的我tcsh
:
Cns# spamdb | fgrep TRAPPED | sort -n -t '|' -k 3 | sed -E -e 's#\|#@#g' \
-e 's#^([A-Z]+)@([0-9.]+)@([0-9]+)$#"echo -n \2_"; "date -r \3"#g' | \
xargs -n1 sh -c | awk '{gsub("_","\t",$0); print;}'
37.146.207.209 Thu Feb 14 00:54:56 PST 2013
113.163.117.129 Thu Feb 14 02:15:03 PST 2013
212.156.98.210 Thu Feb 14 02:16:55 PST 2013
113.171.216.201 Thu Feb 14 02:24:41 PST 2013
59.99.160.62 Thu Feb 14 03:03:05 PST 2013
86.127.116.162 Thu Feb 14 03:14:52 PST 2013
92.83.139.194 Thu Feb 14 03:57:36 PST 2013
122.177.159.61 Thu Feb 14 04:23:16 PST 2013
219.71.12.150 Thu Feb 14 04:25:04 PST 2013
36.231.9.231 Thu Feb 14 10:14:09 PST 2013