各位前輩大家好:
小弟想要用Python抓取 VsFTP Log 的日期,Log格式如下:
Fri Sep 1 15:43:46 2017 1 ::ffff:172.18.1.168 14848 /IT_inventory.xls b _ i r user01 ftp 0 * c
程式碼如下:
#!/usr/bin/python
import re
with open("/var/log/xferlog") as log:
for line in log:
pattern = re.compile(r'(\w+) (\w+)')
match = pattern.search(line)
print match.group(1)
print match.group(2)
以上程式碼可以抓出Fri 和 Sep 沒有問題,結果如下:
group(1) = Fri
group(2) = Sep
但因為我也想要抓出日期,(Log的第三個值9月1號的1),
所以將Pettern 加入了比對數字的\d
pattern = re.compile(r'(\w+) (\w+) (\d+)')
match = pattern.search(line)
print match.group(1)
print match.group(2)
print match.group(3)
但輸出會變成從46秒那個值開始比對,結果如下:
group(1) = 46
group(2) = 2017
group(3) = 1
想要請教各位前輩這是為什麼呢!?
我試的結果跟你不一樣
$cat testre.py
import re
line = "Fri Sep 1 15:43:46 2017 1 ::ffff:172.18.1.168 14848 /IT_inventory.xls b _ i r user01 ftp 0 * c"
pattern = re.compile(r'(\w+) (\w+) (\d+)')
match = pattern.search(line)
print match.group(1)
print match.group(2)
print match.group(3)$
$
$
$python testre.py
Fri
Sep
1
$
如果你不想繼續找原因
而想先解決問題的話
可以把 RE 改成這樣試試看
(w 是 a-z0-9, D 是非數字)
pattern = re.compile(r'(\D+) (\D+) (\d+)')
您好!是的,改成(\D+) (\D+) (\d+) 就可以順利抓取字串,謝謝!
我試過和你一樣直接在Code裡面加上:
line = "Fri Sep 1 15:43:46 2017 1 ::ffff:172.18.1.168 14848 /IT_inventory.xls b _ i r user01 ftp 0 * c"
(\w+) (\w+) (\d+)就可以順利找到 Fri Sep 1
但如果用with開檔案的方式就不行,有點好奇不知道是為什麼~
如果用with開檔案的方式就不行,有點好奇不知道是為什麼~
真的想知道原因
就先把一個 line 一個 line 顯示出來
確認是你原先預期的樣子