从列表中读取 .gz 文件并打印行
Read .gz files from a list and print lines
基本上,我有一个文件夹,每天都在其中归档绝对巨大的日志文件。每天更精确地创建 3 个日志文件。
我正在编写一个 Python 脚本,用户必须在其中输入 YYYYMMDD 格式的日期才能找到在该日期创建的 3 个文件,然后他输入一个 IP 地址。脚本将读取 3 个 .gz 文件的内容并打印 IP 地址所在的行。
import re
import os
import glob
import gzip
from datetime import datetime, timedelta
date_entry = raw_input('Give a date in format YEAR, MONTH, DAY \n')
date = datetime.strptime(re.sub("\s+", "", date_entry), "%Y,%m,%d").date()
path = "/applis/tacacs/log/"
list_of_files = [
file for file in glob.glob(path + '*.gz')
if date == datetime.fromtimestamp(os.path.getmtime(file)).date()
]
print("Files found: ")
print(list_of_files)
Adresse_IP = raw_input('IP Address \n')
for line in gzip.open(list_of_files):
if re.search(Adresse_IP, line):
print line
但是我收到以下错误:
File "scriptacacs3.py", line 19, in <module>
for line in gzip.open(list_of_files):
File "/usr/lib/python2.7/gzip.py", line 34, in open
return GzipFile(filename, mode, compresslevel)
File "/usr/lib/python2.7/gzip.py", line 94, in __init__
fileobj = self.myfileobj = __builtin__.open(filename, mode or 'rb')
TypeError: coercing to Unicode: need string or buffer, list found
显然它正在等待一个字符串。有没有办法以不同的方式做到这一点?是否可以一次读取一个文件?
编辑:在这种情况下可以使用文件输入法吗?例如使用 fileinput.hook_compressed 因为文件是 .gz 格式并且在列表中。
我还提到输入日期后找到的文件如下所示:
['/applis/tacacs/log/tacacs.log.7.gz', '/applis/tacacs/log/tacacs_acct.log.7.gz', '/applis/tacacs/log/tacacs_provisioning.log.4.gz']
我整个早上都在寻找一种方法来做这件事,但我仍然被困住了。如果有人能给我线索,我将不胜感激。
您一次传递了过滤后的日志文件名称的完整列表,这就是为什么会出现错误,迭代列表传递或逐个读取文件然后搜索文件
import re
import os
import glob
import gzip
from datetime import datetime, timedelta
date_entry = raw_input('Give a date in format YEAR, MONTH, DAY \n')
date = datetime.strptime(re.sub("\s+", "", date_entry), "%Y,%m,%d").date()
path = "/applis/tacacs/log/"
list_of_files = [
file for file in glob.glob(path + '*.gz')
if date == datetime.fromtimestamp(os.path.getmtime(file)).date()
]
print("Files found: ")
print(list_of_files)
Adresse_IP = raw_input('IP Address \n')
for fname in list_of_files: #iterate log file names to open it one by one
with gzip.open(fname, 'r') as file: #open single file
for line in file: #iterate all lines
if re.search(Adresse_IP, line): #search line
print(line) #print line if match
基本上,我有一个文件夹,每天都在其中归档绝对巨大的日志文件。每天更精确地创建 3 个日志文件。
我正在编写一个 Python 脚本,用户必须在其中输入 YYYYMMDD 格式的日期才能找到在该日期创建的 3 个文件,然后他输入一个 IP 地址。脚本将读取 3 个 .gz 文件的内容并打印 IP 地址所在的行。
import re
import os
import glob
import gzip
from datetime import datetime, timedelta
date_entry = raw_input('Give a date in format YEAR, MONTH, DAY \n')
date = datetime.strptime(re.sub("\s+", "", date_entry), "%Y,%m,%d").date()
path = "/applis/tacacs/log/"
list_of_files = [
file for file in glob.glob(path + '*.gz')
if date == datetime.fromtimestamp(os.path.getmtime(file)).date()
]
print("Files found: ")
print(list_of_files)
Adresse_IP = raw_input('IP Address \n')
for line in gzip.open(list_of_files):
if re.search(Adresse_IP, line):
print line
但是我收到以下错误:
File "scriptacacs3.py", line 19, in <module>
for line in gzip.open(list_of_files):
File "/usr/lib/python2.7/gzip.py", line 34, in open
return GzipFile(filename, mode, compresslevel)
File "/usr/lib/python2.7/gzip.py", line 94, in __init__
fileobj = self.myfileobj = __builtin__.open(filename, mode or 'rb')
TypeError: coercing to Unicode: need string or buffer, list found
显然它正在等待一个字符串。有没有办法以不同的方式做到这一点?是否可以一次读取一个文件?
编辑:在这种情况下可以使用文件输入法吗?例如使用 fileinput.hook_compressed 因为文件是 .gz 格式并且在列表中。
我还提到输入日期后找到的文件如下所示:
['/applis/tacacs/log/tacacs.log.7.gz', '/applis/tacacs/log/tacacs_acct.log.7.gz', '/applis/tacacs/log/tacacs_provisioning.log.4.gz']
我整个早上都在寻找一种方法来做这件事,但我仍然被困住了。如果有人能给我线索,我将不胜感激。
您一次传递了过滤后的日志文件名称的完整列表,这就是为什么会出现错误,迭代列表传递或逐个读取文件然后搜索文件
import re
import os
import glob
import gzip
from datetime import datetime, timedelta
date_entry = raw_input('Give a date in format YEAR, MONTH, DAY \n')
date = datetime.strptime(re.sub("\s+", "", date_entry), "%Y,%m,%d").date()
path = "/applis/tacacs/log/"
list_of_files = [
file for file in glob.glob(path + '*.gz')
if date == datetime.fromtimestamp(os.path.getmtime(file)).date()
]
print("Files found: ")
print(list_of_files)
Adresse_IP = raw_input('IP Address \n')
for fname in list_of_files: #iterate log file names to open it one by one
with gzip.open(fname, 'r') as file: #open single file
for line in file: #iterate all lines
if re.search(Adresse_IP, line): #search line
print(line) #print line if match