У меня есть эта команда (для pomodoros):
play -n synth 25:00 pinknoise
Я не хочу к тихому полностью вывода (-q
опция), просто заголовок (grep
не работайте).
Нормальный вывод:
File Size: 94.3T
Encoding: n/a
Channels: 1 @ 32-bit
Samplerate: 48000Hz
Replaygain: off
Duration: unknown
In:0.00% 00:00:01.02 [00:00:00.00] Out:49.2k [======|======] Hd:1.3 Clip:0
Требуйте фильтрованного вывода: 01.02
(это число обновляется, как в ЗАВИХРЕНИИ или pv
индикатор выполнения)
Как может я grep просто что часть вывода?
До сих пор:
Вывод отправляется stderr, как с "Разрешением, отклоненным" от find
. Простой способ протестировать (я думал, что попробовал) состоит в том, чтобы добавить в конце 2> /dev/null
.
Я думаю причина, почему вывод носков/игры к stderr - то, потому что это поддерживает запись вывода к стандартному выводу (stdout) использование специального имени файла -
(см. страницу справочника носков).
Но |& grep "^In"
не будет работать. Используя |& tee log.txt
кажется использованием удалить символ для обновления последней строки.
Я попробовал grep --line-buffered
, unbuffer
и stdbuf
(после чтения этого и этого) с некоторым большим прогрессом:
play -n synth 25:00 pinknoise 2>&1 | stdbuf -oL tr '\r' '\n' | grep -o '[0-9][0-9]*\.[0-9][0-9] '
Это очень близко!
Возможно добраться только что, одна обновленная строка любят, был на исходном выводе? Возможно, как этот цикл с echo -ne
.
Я не уверен почему что-то как | grep --line-buffered .
не работает, никакое удаление, запаздывающее новая строка: | tr -d '\n'
. Мне нужно что-то как tail -f -n 1
.
Вы можете grep вывод при передаче по каналу stderr также, например:
$ play -n synth 25:00 pinknoise |& grep File
File Size: 2.52G
От раздела Pipelines руководства Bash GNU:
Если‘
|&
’используется, стандартная погрешность command1, в дополнение к ее стандартному выводу, подключена к стандартному входу command2 через канал; это - сокращение от2>&1 |
. Это неявное перенаправление стандартной погрешности к стандартному выводу выполняется после любых перенаправлений, указанных командой.
Однако это не будет работать на строку прогресса: команды CLI обычно тестируют, является ли вывод к терминалу, и отбрасывание обновило вывод, если это не. Нам нужно hacky обходное решение для обхождения этого. Сначала перенаправьте полный вывод в файл:
play -n synth 25:00 pinknoise &>sox.log
Это блокирует текущий терминал, и Вы не можете только отправить его в фон, потому что затем он отбрасывает строку прогресса снова. Таким образом для получения этой строки откройте второй терминал в том же каталоге и обработайте файл, например:
$ grep In sox.log
In:0.00% 00:00:03.24 [00:00:00.00] Out:156k [======|======] Hd:0.8 Clip:0
$ tail -n+10 sox.log; echo
In:0.00% 00:00:10.24 [00:00:00.00] Out:492k [!=====|=====!] Hd:1.7 Clip:0
Преимущество использования tail
это, Вы также добираетесь Aborted.
строка, когда play
вышедший:
$ tail -n+10 sox.log;echo
In:0.00% 00:00:12.80 [00:00:00.00] Out:614k [======|======] Hd:0.7 Clip:0
Aborted.