0

我在 v 中有如下数据ar/log/messages.log现在我需要搜索 WAM 数据行并仅提取部分时间戳

例如

2013-07-09T02:22:28.535639Z [24] user.info WebAppMgr WAM APPLAUNCH_INITIATED

上面的行包含WAM,我只需要22:28.535639Zmessages.log中的数据

2013-07-09T02:22:28.535639Z [24] user.info WebAppMgr WAM APPLAUNCH_INITIATED 
2013-07-09T02:22:21.817372Z [17] user.info sam SAM  ^Icom.palm.app.calculator
2013-07-09T02:22:21.818442Z [17] user.info sam SAM  ^Icom.palm.app.settings
2013-07-09T02:24:04.738067Z [120] user.info WebAppMgr WAM APPLAUNCH_INITIATED 
2013-07-09T02:22:21.846636Z [17] user.info sam SAM  ^Icom.palm.app.notes
2013-07-09T02:22:21.851727Z [17] user.info sam SAM  ^Icom.palm.app.firstuse
2013-07-09T02:22:21.854172Z [17] user.info sam SAM  ^Icom.palm.app.isis2
2013-07-09T02:22:21.863786Z [17] user.info sam SAM  ^Icom.palm.sysapp.voicedial
2013-07-09T02:24:04.746751Z [120] user.info WebAppMgr WAM APP CREATED WINDOW

我能够提取2013-07-09T02:22:28.535639Z. 我需要知道如何提取22:28.535639Z

#! /bin/sh
awk '/\ WAM/ {print $1"\t"}' /home/santosh/messages

我得到像

2013-07-09T02:22:28.535639Z
2013-07-09T02:24:04.738067Z
2013-07-09T02:24:04.746751Z

但我只需要以下数据

22:28.535639Z
24:04.738067Z
24:04.746751Z
4

8 回答 8

3

您可以在当前的 awk 调用中执行此操作:

awk '/\<WAM\>/ {split($1, a, ":"); print a[2] ":" a[3]}' file

\<and是词\>边界断言。

于 2013-07-09T17:18:56.940 回答
1
with open('path/to/logfile') as logfile:
    for line in logfile:
        if "WAM" in line:
            timestamp = line.partition(" ")[0].partition(":")[2]
            print timestamp

在您的示例上运行上面的代码,我将其作为输出:

22:28.535639Z
24:04.738067Z
24:04.746751Z
于 2013-07-09T17:01:14.740 回答
1

使用日期时间模块:

>>> from datetime import datetime
>>> strs = "2013-07-09T02:22:28.535639Z"
>>> d = datetime.strptime(strs,'%Y-%m-%dT%H:%M:%S.%fZ')
>>> d.strftime('%M:%S.%fZ')
'24:04.746751Z'

代码:

with open('/home/santosh/messages') as f:
    for line in f:
        if 'WAM' in line:
            d = datetime.strptime(line.split()[0],'%Y-%m-%dT%H:%M:%S.%fZ')
            print d.strftime('%M:%S.%fZ')
...             
22:28.535639Z
24:04.738067Z
24:04.746751Z
于 2013-07-09T17:01:23.053 回答
1

根据您使用的标签和您提供的示例,除了基于 Python 的解决方案之外,您似乎对 shell 解决方案持开放态度。由于多样性是生活的调味品,请使用sed

$ sed -n  '/WAM/{s/.*T[0-9]*:\([0-9]*:[0-9]*\.[0-9]*Z\).*/\1/g;p}' /home/santosh/messages 
22:28.535639Z
24:04.738067Z
24:04.746751Z

对于包含“WAM”的任何行,找到与模式“[anything]Tdigits:(digits:digits.digitsZ)[anything]”匹配的文本,然后将该行替换为括号中的匹配文本部分(“ digits:digits.digtsZ") 然后打印出来。-n切换到sedjust 意味着不打印任何内容,除非您告诉它(即使用命令p)。

于 2013-07-09T17:11:56.167 回答
1

使用regex

Python:

import re
with open('/home/santosh/messages') as f:
    for line in f:
        m = re.search(r'^.*?:(\S+).*?WAM',line)
        if m: print m.group(1)

珀尔:

while ($line = <STDIN>){
    if ($line =~ m/^.*?:(\S+).*?WAM/){
        print "$1\n";
        }
}

输出:

$ perl so.pl < abc
22:28.535639Z
24:04.738067Z
24:04.746751Z
于 2013-07-09T17:21:17.320 回答
1

另一种方式awk

awk -F':| ' '/\<WAM\>/{print $2":"$3}' /home/santosh/messages
于 2013-07-09T17:39:10.797 回答
1
cat test.txt | cut -d " " -f 1 | cut -d "T" -f 2 | cut -d ":" -f 2-3

在文件中添加了您的数据...我“剪切”命令可以解决问题...

于 2013-07-09T18:08:04.657 回答
1

一个纯粹的解决方案:

while read a x x x b x; do
  [ "$b" == WAM ] && echo ${a#*:}
done </var/log/messages.log

输出:

22:28.535639Z
24:04.738067Z
24:04.746751Z
于 2013-07-09T18:09:23.577 回答