Разобрать прогресс с помощью sed (или чего-то еще) - PullRequest
3 голосов
/ 14 марта 2012

Я пытаюсь разобрать прогресс из одной программы (это mkvmerge, но я надеюсь, что это не имеет значения):

 echo -en "Progres: 0%" ; sleep 1 ; echo -en "\b\b25%" ; sleep 1 ; echo -en "\b\b\b50%" ; sleep 1 ; echo -en "\b\b\b75%" ; sleep 1 ; echo -e "\b\b\b100%" 

Я бы хотел получить номер без "Прогресс" и "%". Это работает:

echo -e "Progress: 0%"| sed -e 's/Progress: //' -e 's/%//' -e 's/\(....\)\(..\)\(..\)/\1-\2-\3/'

Но когда Прогресс продолжает меняться, он не работает. Есть ли способ сделать это (даже без sed и с чем-то еще)?

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Попробуйте провести через tr, чтобы преобразовать возврат каретки (наиболее вероятно, что он использует) в перевод строки:

<cmd> | tr '\r' '\n' | sed ...

Затем вы можете работать с ним, разделенным на строки, как обычно.

3 голосов
/ 14 марта 2012

Символы \b изменяют текущую строку, поэтому новая строка никогда не печатается.Вы не добьетесь большого успеха из коробки, используя линейный редактор потоков, такой как sed, для такого рода ввода.

Если mkvmerge генерирует такой вывод, то сначала попробуйте поискатьдля переключателя, который заставляет его использовать какой-либо другой индикатор прогресса (предпочтительно тот, который печатает новые строки).

Если это не сработает, вы можете попробовать заменить символы возврата на новую строку:

( echo -en "Progres: 0%" ; sleep 1 ; echo -en "\b\b25%" ; sleep 1 ; echo -en "\b\b\b50%" ; sleep 1 ; 
  echo -en "\b\b\b75%" ; sleep 1 ; echo -e "\b\b\b100%" ) | tr '\b' '\n'

Добавьте небуферинг, используя stdbuf, и кажется, что мы здесь, по крайней мере, для вашего примера:

( echo -en "0%" ; sleep 1 ; echo -en "\b\b25%" ; sleep 1 ; echo -en "\b\b\b50%" ; sleep 1 ; 
  echo -en "\b\b\b75%" ; sleep 1 ; echo -e "\b\b\b100%" ) | stdbuf -i0 -o0 -e0 tr '\b' '\n' | 
  stdbuf -i0 -o0 -e0 sed -e 's/Progress: //' -e 's/%//' -e 's/\(....\)\(..\)\(..\)/\1-\2-\3/'

Вывод, который появился на экране в том виде, как он был создан благодаря stdbuf (Iобрезаны некоторые ложные символы новой строки):

0
25
50
75
100
...