我的文件看起来像这样。
[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
但由于后缀字符,使用数字排序将不起作用。任何人都可以帮助我这个排序部分。需要按时间戳值排序。
答案 0 :(得分:1)
使用sort -nk3.18
排除字段3中的最后4个字符。
来自man sort
:
-k, - key = KEYDEF通过键排序; KEYDEF给出位置和类型
KEYDEF是开始和停止位置的F [.C] [OPTS] [,F [.C] [OPTS]],其中F是字段编号,C是字符位置 领域;两者都是ori- 杜松子酒1,停止位置默认为线的结束。如果-t和-b都不起作用,则字段中的字符将从中计算 一开始 前面的空格。 OPTS是一个或多个单字母排序选项[bdfgiMhnRrV],它覆盖全局 订购选项 键。如果没有给出密钥,请使用整行作为密钥。 ë
答案 1 :(得分: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
形式(您可能需要调整正则表达式)。这样做你想要的吗?