有人能通过Python 2.4子流程方法提供正确的语法来运行下面的grep命令吗?
# grep -n down /tmp/support/alarms/SS7Alarms.*
/tmp/support/alarms/SS7Alarms.263:8301:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.264:7733:LAES: SS7MGR: Association Id 1 is down
/tmp/support/alarms/SS7Alarms.264:7737:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.264:12603:LAES: SS7MGR: Association Id 1 is down
/tmp/support/alarms/SS7Alarms.264:12607:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.265:6523:LAES: SS7MGR: Association Id 1 is down
/tmp/support/alarms/SS7Alarms.265:6531:LAES: SS7MGR: Association Id 1 is down
/tmp/support/alarms/SS7Alarms.267:10349:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.270:11159:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.270:13229:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.271:13041:LAES: SS7MGR: Association Id 2 is down
我可以获得一个单独的文件来工作:
p = subprocess.Popen(["grep", "-n", "down", "/tmp/support/alarms/SS7Alarms.263"], stdout=subprocess.PIPE)
当我尝试grep多个文件时,它失败了:
p = subprocess.Popen(["grep", "-n", "down", "/tmp/support/alarms/SS7Alarms.*"], shell=True, stdout=subprocess.PIPE)
>>> Usage: grep -hblcnsviw pattern file . . .
没有这样的文件/tmp/support/alarms/SS7Alarms.*
。必须将每个文件作为单独的参数传递给grep。*
在shell中工作的唯一原因是,在将*
传递给grep之前,shell会将其扩展为多个参数。
如果要扩展globs,请使用glob
模块:
import glob
p = subprocess.Popen(
["grep", "-n", "down"] + glob.glob("/tmp/support/alarms/SS7Alarms.*"),
stdout=subprocess.PIPE)
您可以只使用shell=True
作为Popen
的参数,但这可能会导致其他问题。
经过几个小时的环顾,我放弃了,在stackoverflow上发帖,只想通过几分钟的测试。
p = subprocess.Popen('grep -n down /tmp/support/alarms/SS7Alarms.*', shell=True, stdout=subprocess.PIPE)
将完整的命令放入一个字符串中就可以了。