Shell脚本程序在message.log文件中提取部分时间戳

时间:2013-07-09 16:57:38

标签: linux bash shell

我在v ar/log/messages.log中有类似下面的数据现在我需要搜索WAM数据行并且只删除时间戳的一部分

例如

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

上面一行包含WAM,我在messages.log中只需要22:28.535639Z个数据

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

8 个答案:

答案 0 :(得分:3)

您可以在当前的awk通话中执行此操作:

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

\<\>是字边界断言。

答案 1 :(得分: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

答案 2 :(得分:1)

使用datetime模块:

>>> 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

答案 3 :(得分: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切换到sed只是意味着除非您告诉它(即使用p命令),否则不要打印任何内容。

答案 4 :(得分: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)

<强>的Perl:

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

<强>输出:

$ perl so.pl < abc
22:28.535639Z
24:04.738067Z
24:04.746751Z

答案 5 :(得分:1)

awk的另一种方式:

awk -F':| ' '/\<WAM\>/{print $2":"$3}' /home/santosh/messages

答案 6 :(得分:1)

cat test.txt | cut -d " " -f 1 | cut -d "T" -f 2 | cut -d ":" -f 2-3

在文件中添加了您的数据......我“剪切”命令可以做到这一点......

答案 7 :(得分: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