0

我从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,以便在事件发生时它可以呈现和清晰。

我如何tcsh在 OpenBSD 上做到这一点?

排序sort很容易,用sed;编辑也是如此。但我如何sed执行date -r或等效?

4

1 回答 1

0

这里确实存在一些障碍:首先,您基本上必须分离数据,然后将其中一部分按原样呈现,而另一部分必须传递给date -r日期格式,然后才能呈现给用户.

另一个障碍是确保输出对齐:显然,在 shell 中处理制表符非常困难,可能只在 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
于 2013-02-13T22:16:45.413 回答