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

How to get one line from a print output in linux?

我正在尝试从 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.]*\)$##p0'",stderr= subprocess.STDOUT, shell=True)

谢谢

grep-in 行呢?

output = subprocess.check_output("sox /home/pi/OnoSW/data/opsoroassistant/rec.wav -n stat 2>&1 | grep 'RMS     amplitude:'",stderr= subprocess.STDOUT, shell=True)

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

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

我还必须删除 sed 替换命令末尾 p 之后的 0

您还可以在 Python 中进行输出处理(使用 re),而不是分拆另一个子进程来执行 sed 命令。这可能更容易调试。

为了修复你的行,你需要删除末尾的 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()