2013-07-09 41 views
0

我有一個像下面的數據以V ar/log/messages.log現在我需要尋找WAM數據線和Exrtract只有時間戳的一部分shell腳本程序提取時間戳的一部分message.log文件

對於實例

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 

回答

3

您可以在當前的awk調用做到這一點:

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

\<\>是單詞邊界斷言。

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

與打開('var/log/messages')作爲日誌文件:但拋出錯誤,如 msg2.py:1:msg2.py:語法錯誤:「(」意外 – santy

+0

我寫我的代碼在python 2.7。請確保您使用的是相同版本 – inspectorG4dget

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 
1

根據你所使用的標籤和你給的例子,似乎你開除了外殼的解決方案基於Python的。由於品種是生活的調味品,使用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」任意行,找到匹配的模式文本「[任何] Tdigits:(位數:digits.digitsZ)[什麼]」 ,然後將該行替換爲括號內的匹配文本部分(「digits:digits.digtsZ」),然後將其打印出來。 -n切換到sed只意味着除非您告訴它(即使用p命令),否則不會打印任何內容。

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 
1

awk另一種方式:

awk -F':| ' '/\<WAM\>/{print $2":"$3}' /home/santosh/messages 
1
cat test.txt | cut -d " " -f 1 | cut -d "T" -f 2 | cut -d ":" -f 2-3 

添加您的文件中的數據。我 「切」 命令可以做的伎倆......

+0

Brrr ...使用四個外部工具和'cat'絕對沒用! – TrueY

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 
相關問題