Python2.4子进程和Solaris 10上的grep多个文件



有人能通过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)

将完整的命令放入一个字符串中就可以了。

最新更新