我知道os.popen现在已被弃用。因此,这是将os.popen命令转换为子进程的最简单方法。
cmd_i = os.popen('''sed -n /%s/,/%s/p %s | grep "Invalid Credentials"''' % (st_time, en_time, fileName))
答案 0 :(得分:0)
select name as final_name, last_name as final_last_name, us_address as address, phone_number as phone, car_no
from USA
union all
select name, last_name, india_address, phone_number , null
from India
代码将大致等效。
subprocess
输出被捕获到一个变量中,而不是溢出到Python控制之外的标准输出中。如果您只想output = subprocess.check_output(
'''sed -n /%s/,/%s/p %s | grep "Invalid Credentials"''' % (st_time, en_time, fileName),
shell=True)
,那就继续吧。
如果print
未找到任何内容,这将引发异常。如果您想以一种或另一种方式处理这种极端情况,可以用grep
对其进行陷印。
但是,您可以轻松地用原生Python代码替换所有这些内容。
except
在这种情况下,with open(fileName, 'r') as input:
between = False
output = []
for line in input:
if st_time in line:
between = True
if between and 'Invalid Credentials' in line:
output.append(line)
if en_time in line:
between = False
是一个列表。每个捕获的行仍包含其终止的换行符。 (当然,如果那不是您想要的,易于修复。)
作为一种优化,您可以在看到output
时break
(尽管该脚本与en_time
脚本并不完全等效)。
这也应该很容易适应sed
不在日志文件中确切出现的情况。您将需要解析每行上的时间戳,然后在解析的日期戳等于(或大于)st_time
值时简单地开始处理。同样,解析st_time
并在看到带有等于或大于该值的时间戳的日志条目时退出。