【问题标题】:Python: Shell with grep value stored in variable appends always a additional linePython:具有存储在变量中的grep值的Shell总是附加一行
【发布时间】:2020-02-11 02:13:59
【问题描述】:

我忘记添加了,我必须从 python 调用 shell, 我有一个文件

cat file.txt
b
bb
bbb

如果只有“bb”存在则打印,否则失败,

str=subprocess.check_output('grep bb file.txt || echo 2',shell=True)
print 'str='+str  # This always str=bb and an extra line
if (str == 'bb'):   # Wish  better way like str == '1'
  print "Pass"
elif(str == '2') :
  print "Fail"

我认为应该有更好的处理方式。

【问题讨论】:

  • 您可以尝试将--quiet 添加到您的grep 调用中吗?这应该会抑制 grep 打印匹配行。
  • 这是解决问题的真正次优方法。尝试使用 Python,而不是使用 grep。
  • -q (quiet) 抑制所有标准输出(事实上我的是从 python 调用的多阶段 grep shell 命令)
  • @Krishna :您的grep 测试该行是否包含两个连续的b。因此它也匹配bbb。要查找仅包含 bb 而没有其他内容的行,grep -Fx bb 可以完成这项工作。但正如其他几个人已经指出的那样,为这个任务调用子进程是没有意义的,因为你可以在 Python 中轻松地做到这一点。

标签: python shell grep subprocess


【解决方案1】:

尝试打开文件并逐行或整体读取:

  • 作为一个整体
    with open("file.txt", "r") as file:
        data = file.read()
        if "bbb" in data:
            print("Pass")
        else:
            print("Fail")
  • 或逐行
    with open("file.txt", "r") as file:
        line = file.readline()
        while line:
            if "bbb" == line:
                print("Pass")
                break
            line = file.readline()
        print("Fail")

编辑:我看到你编辑了你的问题。 if 语句可以更改并且不会影响程序,因此您检查的内容无关紧要(例如“bbb”或“11”)。逐行检查也是一个更好更快的选择。

【讨论】:

  • 谢谢,实际上我的命令是多级 grep 并从 python 调用,(我只是在那里放了一个示例代码),无论如何要抑制额外的尾随行,因此要避免多行检查 str 值.
  • 我可以将 'str' 本身读取为字符流(如文件)吗?
  • 你想读取line返回的字符串的每个字符吗?
  • 是的,我专注于 'str',因为在实际情况下,我可能会得到多次出现的模式行(比如 'bbb' 、'bbbbb' 等)
  • 检查该字符串是否在一行中的方式可以满足您的要求。它检查“bbb”是否完全等于该行。你有什么理由要检查一个字符串有多少个字符?
猜你喜欢
  • 1970-01-01
  • 2012-09-10
  • 2023-02-04
  • 1970-01-01
  • 2018-07-31
  • 2018-12-13
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多