iT邦幫忙

0

Python 利用正規表示法抓取 VsFTP Log

各位前輩大家好:

小弟想要用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

想要請教各位前輩這是為什麼呢!?

froce iT邦大師 1 級 ‧ 2017-09-06 11:38:22 檢舉
https://regex101.com/#python
請愛用這個。
ilikeperl iT邦新手 5 級 ‧ 2017-09-06 23:39:09 檢舉
您好,已經試過,在網站上可以Match

1 個回答

2
海綿寶寶
iT邦大神 1 級 ‧ 2017-09-06 09:49:24

我試的結果跟你不一樣

$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+)')
ilikeperl iT邦新手 5 級 ‧ 2017-09-06 23:47:02 檢舉

您好!是的,改成(\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 顯示出來
確認是你原先預期的樣子

我要發表回答

立即登入回答