2017-01-08 9 views
-1

をgrepし、私は次の形式のエントリを持つログを持っている:検索日と

1483528632 3 1 Wed Jan 4 11:17:12 2017 501040002 4 
1533528768 4 2 Thu Jan 5 19:17:45 2017 534040012 3 
... 

私は正規表現を使用してのみ、タイムスタンプコンポーネント(例えばWed Jan 4 11:17:12 2017を。)の取得方法を教えてください。

私はPythonで最終製品を実装する必要がありますが、最終回の製品が最終的にPythonになるように、自動回帰スイートの一部をbash/perlに入れることが必要です。

+0

私はPythonで最終製品を実装しましたが、要件は、自動回帰スイートの一部を持つことですbash/perlではgrep、unix、regexとして記述しましたが、最終的にはPythonになります。 – Naumann

答えて

-1
grep -E '\b(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) +[0-9]+ [0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{4}\b' dates 
1

フォーマットはスペース区切り文字の面で固定されている場合、あなたは、単にsplit、日付文字列のスライスを取得し、datetime.strptime()経由datetimeオブジェクトにロードできます

In [1]: from datetime import datetime 

In [2]: s = "1483528632 3 1 Wed Jan 4 11:17:12 2017 501040002 4" 

In [3]: date_string = ' '.join(s.split()[3:8]) 

In [4]: datetime.strptime(date_string, "%a %b %d %H:%M:%S %Y") 
Out[4]: datetime.datetime(2017, 1, 4, 11, 17, 12) 
+0

私はスペースが変わっていて、いくつかの項目でもタブ区切りのデータです – Naumann

-1

あなただけたい場合は、

sed -nre 's/^.*([A-Za-z]{3}\s+[A-Za-z]{3}\s+[0-9]+\s+[0-9]+:[0-9]+:[0-9]+\s+[0-9]{4}).*$/\1/p' filename 
1

時間を一致させる正規表現:日付、おそらくというよりはgrepを、リストしますスタンプは:

'[a-zA-Z]{3} +[a-zA-Z]{3} +\d{1,2} +\d{2}:\d{2}:\d{2} +\d{4}'です。あなたがそうのようなものを使用することができますPythonで

$ grep -oE '[a-zA-Z]{3} +[a-zA-Z]{3} +\d{1,2} +\d{2}:\d{2}:\d{2} +\d{4}' log.txt 
# Wed Jan 4 11:17:12 2017 
# Thu Jan 5 19:17:45 2017 

import re 

log_entry = "1483528632 3 1 Wed Jan 4 11:17:12 2017 501040002 4" 

pattern = '[a-zA-Z]{3} +[a-zA-Z]{3} +\d{1,2} +\d{2}:\d{2}:\d{2} +\d{4}' 
compiled = re.compile(pattern) 
match = compiled.search(log_entry) 
match.group(0) 
# 'Wed Jan 4 11:17:12 2017' 

あなたは(あなたのログファイルはlog.txt呼び出された場合)、このように使用することができますgrepので

これを使用して文字列から実際のdatetimeオブジェクトを取得することができます(コードの上に展開)。

from datetime import datetime 
import re 

log_entry = "1483528632 3 1 Wed Jan 4 11:17:12 2017 501040002 4" 

pattern = '[a-zA-Z]{3} +[a-zA-Z]{3} +\d{1,2} +\d{2}:\d{2}:\d{2} +\d{4}' 
compiled = re.compile(pattern) 
match = compiled.search(log_entry) 

log_time_str = match.group(0) 
datetime.strptime(log_time_str, "%a %b %d %H:%M:%S %Y") 
# datetime.datetime(2017, 1, 4, 11, 17, 12) 
0

二つのアプローチ:持つと正規表現
1を使用せずに)re.findall()機能使用:

with open('test.log', 'r') as fh: 
    lines = re.findall(r'\b[A-Za-z]{3}\s[A-Za-z]{3}\s{2}\d{1,2} \d{2}:\d{2}:\d{2} \d{4}\b',fh.read(), re.M) 

print(lines) 

2) usign str.split()str.join()機能を:

with open('test.log', 'r') as fh: 
    lines = [' '.join(d.split()[3:8]) for d in fh.readlines()] 

print(lines) 

どちらの場合も出力

['Wed Jan 4 11:17:12 2017', 'Thu Jan 5 19:17:45 2017'] 
1

syslogを使用している場合は、Grepがこのシナリオで最もよく使用されます。しかし、ポストもPythonでタグ付けされています。

import re 

が一致するパターンを定義します:

pat = "\w{3}\s\w{3}\s+\w\s\w{2}:\w{2}:\w{2}\s\w{4}" 

はその後再使用この例ではre正規表現を使用しています。TXTパターンのすべての重複しないマッチを返すためにfindAll:

re.findall(pat,txt) 

出力:

['Wed Jan 4 11:17:12 2017', 'Thu Jan 5 19:17:45 2017'] 
あなたが使用したい場合は

datetime

import datetime 

dates = re.findall(pat,txt) 

datetime.datetime.strptime(dates[0], "%a %b %d %H:%M:%S %Y") 

出力:

datetime.datetime(2017, 1, 4, 11, 17, 12) 

あなたは、これらのDateTimeオブジェクトを利用することができます

dateObject = datetime.datetime.strptime(dates[0], "%a %b %d %H:%M:%S %Y").date() 
timeObject = datetime.datetime.strptime(dates[0], "%a %b %d %H:%M:%S %Y").time() 

print('The date is {} and time is {}'.format(dateObject,timeObject)) 

出力:

The date is 2017-01-04 and time is 11:17:12