【问题标题】:grep and then parse, python commandlinegrep 然后解析,python 命令行
【发布时间】:2016-10-28 05:46:30
【问题描述】:

当我这样做时,在 python 代码中,

os.system("mpstat 1 10 | grep Average")

我明白了,在标准输出:

“平均:所有 0.00 0.00 0.00 0.00”和一堆其他的东西

我可以添加什么

mpstat 1 10 | grep Average | SOMETHING

获取包含以 Average 开头的行的变量?

我需要第一个数字和第二个数字的总和。

我在这里尝试了接受的答案:

Can I redirect the stdout in python into some sort of string buffer?

但它不起作用。

【问题讨论】:

  • 你已经得到了以Average开头的行。你在找什么 ?第一个数字和第二个数字是什么意思?
  • 第一个数字是 0.00,在这种情况下第二个数字是 0.00。我需要将该行保存在字符串/变量中,以便稍后在我的 python 代码中解析或使用它。
  • 我也试过这个:wrongsideofmemphis.wordpress.com/2010/03/01/… 它不起作用。 (我将 do_fancy_stuff() 替换为 os.system("mpstat 1 10 | grep Average")
  • 是否要添加上一行中出现在“all”之后的前两个数字?
  • 是的。我想添加数字,甚至可以在我的代码中访问它们。

标签: python shell unix command-line grep


【解决方案1】:

取消os.system 电话。请改用subprocess.Popen。以下是你的做法:

>>> from subprocess import Popen
>>> from subprocess import PIPE
>>> mpstat = Popen(["mpstat", "1", "10"], stdout=PIPE)
>>> grep = Popen(["grep", "Average"], stdin=mpstat.stdout, stdout=PIPE)
>>> mpstat.stdout.close()
>>> res, err = grep.communicate()
>>> res
'Average:     all    0.79    0.00    0.46    0.03    0.00    0.01    0.00    0.00    0.00   98.71\n'
>>> res.strip().split()
['Average:', 'all', '0.79', '0.00', '0.46', '0.03', '0.00', '0.01', '0.00', '0.00', '0.00', '98.71']
>>> res.strip().split()[2:4]
['0.79', '0.00']
>>> values = map(float, res.strip().split()[2:4])
>>> values
[0.79, 0.0]

【讨论】:

  • Popen 没有阻塞。我想在获得“值” - [0.79, 0.0] 后立即用 pkill -f 名称杀死另一个进程。那么,在您的示例中 >>values 下面的行中说 pkill -f name 是否安全?如果是这样,它是如何工作的,因为 Popen 没有阻塞。一定有什么东西阻碍了它的工作。
  • communicate(..) 之后,您的子进程(mpstat 和 grep)实际上已经退出。如果你想杀死那些进程——不要——不需要。如果你想杀死另一个进程不相关的进程,你可以随时执行。
  • 因此,communicate() 是造成这种阻塞的原因,从某种意义上说,如果 mpstat 持续时间为 200 秒,那么在执行通信()之后的所有内容都需要 200 秒?是的,我想在获得“值”结果后立即终止 mpstat 正在测量的另一个无关进程。所以,据我了解,在上面的代码之后(或在通信()之后)杀死该进程(mpstat 正在测量的不相关进程)是可以的
  • 非常感谢!
猜你喜欢
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2020-01-25
  • 2020-01-01
相关资源
最近更新 更多