Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.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
python-需要在python中调用awk和sed的帮助吗_Python_Awk_Sed - Fatal编程技术网

python-需要在python中调用awk和sed的帮助吗

python-需要在python中调用awk和sed的帮助吗,python,awk,sed,Python,Awk,Sed,我在bash(Linux)上测试了以下命令,它运行良好: awk '/string1\/parameters\/string2/' RS= myfile | grep Value | sed 's/.*"\(.*\)"[^"]*$/\1/' 现在我必须在python脚本中调用它,而string1和string2是python变量 我用os.popen试过了,但我不知道如何连接字符 有没有办法解决这个问题 提前感谢您的帮助 您可以使用format()将变量替换到命令中: 但请注意参考文档中有关使

我在bash(Linux)上测试了以下命令,它运行良好:

awk '/string1\/parameters\/string2/' RS= myfile | grep Value | sed 's/.*"\(.*\)"[^"]*$/\1/'
现在我必须在python脚本中调用它,而string1和string2是python变量

我用os.popen试过了,但我不知道如何连接字符

有没有办法解决这个问题

提前感谢您的帮助

您可以使用format()将变量替换到命令中:

但请注意参考文档中有关使用
shell=True
的警告

另一种方法是使用
Popen()
自己设置管道:

您可以使用Popen:

from subprocess import PIPE,Popen
from shlex import split

p1 = Popen(split("awk /string1\/parameters\/string2 RS=myfile"), stdout=PIPE)
p2 = Popen(["grep", "Value"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
p3 = Popen(split("""sed 's/.*"\(.*\)"[^"]*$/\1/'"""), stdin=p2.stdout, stdout=PIPE)
p2.stdout.close() # Allow p2 to receive a SIGPIPE if p3 exits.

output = p3.communicate()[0]

您可以发布您编写的代码以便我们对其进行评论吗?为什么您使用awk/sed/grep而不是在Python中使用
re
模块?如果您提供了一个最简单的工作示例和/或您试图解决的实际问题的描述,您将在这里获得更大的成功。谢谢您,您的解决方案对我有效(p3除外),但我相信我会解决问题!感谢您的回复,我使用Python2.6.6,因此无法使用check_输出,第二个解决方案对我也不起作用,但可能我犯了一个错误,因此我将再次检查它。无论如何谢谢你!您已经接受了Padraic的答案(没有错),它也使用了
subprocess.Popen()
。我的替代方案基本上是相同的,也应该有效。
import shlex
from subprocess import Popen, PIPE

awk_cmd = """awk '/{}\/parameters\/{}/' RS= myfile""".format('s1', 's2')
grep_cmd = 'grep Value'
sed_cmd = """sed 's/.*"\(.*\)"[^"]*$/\1/'"""

p_awk = Popen(shlex.split(awk_cmd), stdout=PIPE)
p_grep = Popen(shlex.split(grep_cmd), stdin=p_awk.stdout, stdout=PIPE)
p_sed = Popen(shlex.split(sed_cmd), stdin=p_grep.stdout, stdout=PIPE)

for p in p_awk, p_grep:
    p.stdout.close()

stdout, stderr = p_sed.communicate()
print stdout
from subprocess import PIPE,Popen
from shlex import split

p1 = Popen(split("awk /string1\/parameters\/string2 RS=myfile"), stdout=PIPE)
p2 = Popen(["grep", "Value"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
p3 = Popen(split("""sed 's/.*"\(.*\)"[^"]*$/\1/'"""), stdin=p2.stdout, stdout=PIPE)
p2.stdout.close() # Allow p2 to receive a SIGPIPE if p3 exits.

output = p3.communicate()[0]