在输出中搜索子字符串,然后打印该行

时间:2016-02-16 14:14:06

标签: python python-3.x

我想列出一个文件,然后在线条中搜索模式,就像我在Bash中一样。

cat /etc/passwd | grep nologin

我尝试以下方法:

#!/usr/bin/python3

import subprocess

CMD=('cat', '/etc/passwd')
SEARCH="nologin"
PIPE_ERG=subprocess.Popen(CMD , stdout=subprocess.PIPE)
OUTPUT = PIPE_ERG.communicate()[0].splitlines()
for LINE in OUTPUT:
  if SEARCH in LINE:
    print(LINE)

如果我用python3执行脚本,我总是得到这个错误消息:

Traceback (most recent call last):
  File "./pipe2.py", line 11, in <module>
    if SEARCH in LINE:
TypeError: 'str' does not support the buffer interface

当我只打印没有搜索的行时,脚本会列出我的所有行。

如何使用模式获得每一行&#34; nologin&#34;从输出?

1 个答案:

答案 0 :(得分:0)

在Python 3中,PIPE_ERG.communicate()[0]不是str,而是bytes,而对于bytesin运算符未定义。您必须先将bytes转换为str。最简单的方法是在循环中执行LINE = str(LINE),或使用LINE.decode()

for LINE in OUTPUT:
    LINE = LINE.decode()
    if SEARCH in LINE:
        print(LINE)

或者将Popenuniversal_newlines=True

一起使用
PIPE_ERG=subprocess.Popen(CMD , stdout=subprocess.PIPE, universal_newlines=True)

来自文档:

  

默认情况下,此函数将以编码字节的形式返回数据。该   输出数据的实际编码可能取决于命令   调用,所以解码到文本往往需要在处理   应用水平。

     

可以通过将universal_newlines设置为True

来覆盖此行为