如何从 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()
我正在尝试从 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()