我在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
答案 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)
纯bash解决方案:
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