如何从linux中的打印输出中获取一行?

时间:2016-06-02 15:02:36

标签: python linux python-2.7 sed subprocess

我试图从subprocess.check_output中提取一行,但到目前为止我没有运气。我正在运行Python脚本,这是我的代码:

output = subprocess.check_output("sox /home/pi/OnoSW/data/opsoroassistant/rec.wav -n stat", shell=True)

这是我在运行脚本时得到的:

Samples read:             80000
Length (seconds):      5.000000
Scaled by:         2147483647.0
Maximum amplitude:     0.001129
Minimum amplitude:    -0.006561
Midline amplitude:    -0.002716
Mean    norm:          0.000291
Mean    amplitude:    -0.000001
RMS     amplitude:     0.000477
Maximum delta:         0.002930
Minimum delta:         0.000000
Mean    delta:         0.000052
RMS     delta:         0.000102
Rough   frequency:          272
Volume adjustment:      152.409

现在我想从这个列表中得到第9行(RMS幅度)。我已经尝试了一些sed,但它没有回馈任何东西:

output = subprocess.check_output("sox /home/pi/OnoSW/data/opsoroassistant/rec.wav -n stat 2>&1 | sed -n 's#^RMS     amplitude:[^0-9]*\([0-9.]*\)$#\1#p0'",stderr= subprocess.STDOUT, shell=True)

谢谢

3 个答案:

答案 0 :(得分:0)

如何改善生产线?

{{1}}

答案 1 :(得分:0)

我认为问题可能是您要匹配空格,但sox实际上是输出制表符来进行列间距。您的终端可能会将选项卡扩展为空格,因此在复制/粘贴输出时,您会看到空格。尝试匹配[[:space:]](任何空格字符)而不是文字空格:

output = subprocess.check_output("sox /home/pi/OnoSW/data/opsoroassistant/rec.wav -n stat | sed -n 's#^RMS[[:space:]]*amplitude:[[:space:]]*\([0-9.]*\)$#\1#p'", shell=True)

我还必须在sed replace命令结束后的0之后删除p

您也可以使用Python(使用re)进行输出处理,而不是旋转其他子进程来执行sed命令。这可能更容易调试。

答案 2 :(得分:0)

为了修复你的行,你需要删除末尾的0并转义'\ 1':

output = subprocess.check_output("sox /home/pi/OnoSW/data/opsoroassistant/rec.wav -n stat 2>&1 | sed -n 's#^RMS     amplitude:[^0-9]*\([0-9.]*\)$#\\1#p'",stderr= subprocess.STDOUT, shell=True)

使用管道并不是真的可取,安全方面,我建议将此行更改为:

p      = subprocess.Popen(('sox', '/home/pi/OnoSW/data/opsoroassistant/rec.wav', '-n', 'stat', '2>&1'), stdout=subprocess.PIPE)
output = subprocess.check_output(('sed', '-n', 's#^RMS     amplitude:[^0-9]*\([0-9.]*\)$#\\1#p'), stdin=p.stdout)
p.wait()