【问题标题】:Python 2.4 subprocess and grep multiple files on Solaris 10Solaris 10 上的 Python 2.4 子进程和 grep 多个文件
【发布时间】:2016-04-07 18:04:49
【问题描述】:

有人可以提供通过 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 . . .

【问题讨论】:

    标签: python grep subprocess wildcard


    【解决方案1】:

    没有这样的文件/tmp/support/alarms/SS7Alarms.*。您必须将每个文件作为单独的参数传递给 grep。 * 在 shell 中工作的唯一原因是 shell 会将 * 扩展为多个参数,然后再将它们传递给 grep。

    如果要扩展 glob,请使用 glob 模块:

    import glob
    
    p = subprocess.Popen(
        ["grep", "-n", "down"] + glob.glob("/tmp/support/alarms/SS7Alarms.*"),
        stdout=subprocess.PIPE)
    

    您可以改用shell=True 作为Popen 的参数,但这可能会导致其他问题。

    【讨论】:

      【解决方案2】:

      环顾数小时后,我放弃并在 stackoverflow 上发帖,只是为了弄清楚几分钟的测试。

      p = subprocess.Popen('grep -n down /tmp/support/alarms/SS7Alarms.*', shell=True, stdout=subprocess.PIPE)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-04
        • 1970-01-01
        • 1970-01-01
        • 2012-02-19
        相关资源
        最近更新 更多