使用Python2.6解析Bash输出
我是一名python新手,在这里我正在为一些概念而挣扎——非常感谢您的帮助 我有一个自定义的系统工具,可以查询数据库,并返回几行作为要读取的结果——每行一行。以下python脚本从原始输入接受站点FQDN,并在该FQDN上运行$path使用Python2.6解析Bash输出,python,bash,parsing,variables,Python,Bash,Parsing,Variables,我是一名python新手,在这里我正在为一些概念而挣扎——非常感谢您的帮助 我有一个自定义的系统工具,可以查询数据库,并返回几行作为要读取的结果——每行一行。以下python脚本从原始输入接受站点FQDN,并在该FQDN上运行$path #!/usr/bin/python import subprocess import getpass #get the site name. site = raw_input("What is the name of the site?: ").strip(
#!/usr/bin/python
import subprocess
import getpass
#get the site name.
site = raw_input("What is the name of the site?: ").strip()
#run path.
cmd = 'path '+ site;
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE);
path_output = p.stdout.read().strip().split('\n')
print path_output
返回如下结果:
[' fqdn = www.hcasc.info', ' account_id = 525925', ' parent_id = 525925', ' nfs = /mnt/stor7-wc2-dfw1/525925/www.hcasc.info', ' server_type = PHP5', ' ssl = False', ' host_ip = 98.129.229.186', ' cgi_hosting = False', ' test_link_ip = 98.129.229.186', ' ipv6_ip = 2001:4800:7b02:100::1600:0']
我怎样才能从“nfs=etc”中去掉多余的空格,或者只取第三列(aka awk'{print$3}')和/或将bash中的每一个结果分配给单独的变量以进行进一步的操作
只是在安装此学习曲线时遇到了一些困难,我们衷心感谢您的帮助。第三列是
line.split()[2]
;如果你想扔掉前两个单词,然后拿走剩下的,那就是line.split(None,2)[-1]
。(split
不带任何参数,或None
作为第一个参数,在任何空格上拆分。)
说明:
(路径输出中的l的l.split(None,2)
是一个生成器表达式,它为路径输出的每个值运行l.split(None,2)
(称之为l
)。它就像一个列表理解,这是相同的事情,但是它周围有[]
,而不是()
,但是它只运行l.split
调用,因为for
循环经过它,然后忘记前面的值,然而,列表理解将首先在每个步骤构建一个包含l.split
所有结果的大列表,然后正常循环该列表。这样做就像
for line in path_output:
var, equals, rest = line.split(None, 2)
...
但要短一点。:)
如果你想把它放到字典里,比如,你可以这样做(只是为了上下文) 或者,在Python2.7/3中,更好
d = { var: rest for var, equals, rest in (l.split(None, 2) for l in path_output) }
当然,您可以在两行中使其更具可读性:
output_vals = (l.split(None, 2) for l in path_output)
d = dict((var, rest) for var, equals, rest in output_vals)
你想要的是一个字典还是一个循环取决于你将要对它进行什么处理,但字典可能是一种更好的方法。第一个问题是:你可以在列表中收集结果,但使用字典更方便 第一个问题:由于您的结果都是以
key=value
的形式出现的,您可以这样提取它们:
results = dict()
for line in p.stdout:
key, value = line.split('=')
results[key.strip()] = value.strip()
像这样调用p.stdout
(或任何文本文件对象)时,它一次隐式读取一行。下一条语句将等号上的行拆分,并将部分分配给两个变量。最后,我们去掉键
和值
周围的空白,并将它们存储在字典中
另外,您还可以使用line.split()
;在空白处拆分行;但是,如果值或(不太可能)键包含嵌入空间,则会出现问题
output_vals = (l.split(None, 2) for l in path_output)
d = dict((var, rest) for var, equals, rest in output_vals)
results = dict()
for line in p.stdout:
key, value = line.split('=')
results[key.strip()] = value.strip()