0

我的文件看起来像这样。

[2013] [ a] INFO : [handleMessage] Handling messages ...

[2013] [ b] INFO : [handleMessage] The message received is: [OS     OS-EVNTSVR0-H                 20130404125956465000RFST  M430   F                   ]
[2013] [ c] INFO : [handleMessage] Complete handling message.

[2013] [ a] INFO : [handleMessage] Handling messages ...

[2013] [ b] INFO : [handleMessage] The message received is: [OS     OS-EVNTSVR0-H                 20130404135956465000RFST  M430   F                   ]

[2013] [ c] INFO : [handleMessage] Complete handling message.

我只想捕获收到的消息。(我已经这样做了)捕获消息后,我必须使用第三列中的时间戳值对其进行排序。但它最后包含一些字符。(例如:对于上述文件 20130404125956465000RFST 和 20130404135956465000RFST )

我收到很多这样的消息,我使用这个命令。

gzgrep 'The message received is:' Receiver.log.2013-04-04*.gz | cut -d"[" -f5 | sort -t -n -k3

但是由于后缀字符,使用数字排序将不起作用。任何人都可以在这个排序部分帮助我。其中需要对时间戳值进行排序。

4

2 回答 2

1

用于sort -nk3.18排除字段 3 中的最后 4 个字符。

来自man sort

-k, --key=KEYDEF 通过键排序;KEYDEF 给出位置和类型

KEYDEF 是 F[.C][OPTS][,F[.C][OPTS]] 表示开始和停止位置,其中 F 是字段编号,C 是字段中的字符位置;两者都是原点 1,停止位置默认为行尾。如果 -t 和 -b 均无效,则字段中的字符从前一个空格的开头开始计数。OPTS 是一个或多个单字母排序选项 [bdfgiMhnRrV],它覆盖该键的全局排序选项。如果没有给出键,则使用整行作为键。e

于 2013-04-05T13:13:56.403 回答
0
$ cat test.log.gz
[2013] [ a] INFO : [handleMessage] Handling messages ...
[2013] [ b] INFO : [handleMessage] The message received is: [OS     OS-EVNTSVR0-H                 20130404125956465000RFST  M430   F               ]
[2013] [ c] INFO : [handleMessage] Complete handling message.
[2013] [ a] INFO : [handleMessage] Handling messages ...
[2013] [ b] INFO : [handleMessage] The message received is: [OS     OS-EVNTSVR0-H                 20130404135956465000RFST  M430   F               ]
[2013] [ c] INFO : [handleMessage] Complete handling message.

$ zcat test.log.gz | perl -ne 'if (/The message received is:/) { push @a, ($_ =~ /\b(\d{20})[A-Z]{4}\b/) } }{ print join "\n", sort @a' | sort
20130404125956465000
20130404135956465000

如果您的时间戳是单独的单词和形式20 digits + 4 upperspace characters(您可能需要调整正则表达式),则此方法有效。这是做你想做的吗?

于 2013-04-05T12:58:03.363 回答