我正在用Python编写代码,该代码正在使用
VXT_CDR_1_1_20180816.DAT
处理日志文件
os.system(command)
代码在这里
import os
command = "cat /home/smslog/CDRS/VXT_CDR_1_1_20180816.DAT | awk -F'|' '{print $3}' |sort|uniq"
output= os.system(command)
#data = str(output)
for d in str(output).split():
print(d)
os.system(command)
返回一个整数,并且 str(output)
不会将 int 转换为字符串并返回 0。
os.system()
只是运行命令,而不将其标准输出连接到 Python,并且仅返回一个小数字来指示命令是否成功(零表示成功)。
如果你想让它的输出可用于Python,你正在寻找
subprocess.run()
或其较小的前辈(如果你需要2.7之前的Python,那么这会变得很麻烦)。
from subprocess import run, PIPE
# refactor to avoid useless cat
command = "awk -F'|' '{print $3}' /home/smslog/CDRS/VXT_CDR_1_1_20180816.DAT |sort|uniq"
result = run(command, shell=True, stdout=PIPE, universal_newlines=True)
# No need to split on newlines just so you can print a newline after each line
print(result.stdout)
对于早期版本的 Python,请查看
subprocess.check_output()
,或者在最坏的情况下,使用 subprocess.Popen()
重新实现它。
我们通常会劝阻人们不要使用
shell=True
,但在这种情况下,通过在Python中重新实现shell的管道功能来摆脱它是相当具有挑战性的。 但这里没有什么是 Python 本身无法完成的,因此最简单的解决方法是首先不使用外部工具。
with open('/home/smslog/CDRS/VXT_CDR_1_1_20180816.DAT') as input:
values = dict()
for line in input:
values[line.rstrip('\n').split('|')[2]] = 1
for value in sorted(values.keys()):
print(value)
收集字典中的值是使某些东西变得独特的常见模式。如果该值已存在于字典中,我们不会通过用相同的信息覆盖它来添加任何新内容。在循环结束时,字典
values
的键是唯一的输入。
subprocess.check_output()
函数并将 shell=True kwarg 传递给它。