Буфер строки CLI: Как передать по каналу к grep поток вывода?

У меня есть эта команда (для 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.

2
задан 17 October 2019 в 07:28

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.
1
ответ дан 2 December 2019 в 04:38

Другие вопросы по тегам:

Похожие вопросы: