Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python2.6解析Bash输出_Python_Bash_Parsing_Variables - Fatal编程技术网

使用Python2.6解析Bash输出

使用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(

我是一名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()

#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()