2016-06-02 4 views
1

Я пытаюсь вытащить одну строку из subprocess.check_output, но до сих пор мне не повезло. Я бегу сценарий Python, и это мой код:Как получить одну строку из вывода печати в Linux?

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 амплитуда) из этого списка. Я уже пытался что-то с СЕПГ, но оно не дало ничего назад:

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) 

Спасибо

+0

Почему не удается разобрать результат для получения 9-й строки? – SilentMonk

ответ

0

насчет Grep-джеями линию?

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

О, просто, спасибо! – Mat

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) 

Я также должен был удалить 0 после p в конце вашей команды SED заменить.

Вы также можете выполнить обработку вывода в Python (используя re) вместо того, чтобы откручивать другой подпроцесс для выполнения команды sed. Это, вероятно, будет легче отлаживать.

+0

Когда я поставил ваш код, он дал мне весь список, а не только амплитуду RMS, но все равно спасибо, он работал с использованием grep – Mat

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) 

Кроме того, используя трубу не очень желательно, безопасность мудрый, я d предлагаю изменить эту строку на:

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() 
Смежные вопросы