Как удалить новые строки в потоке во время его мгновенной печати? - PullRequest
0 голосов
/ 19 октября 2018

Я хочу загрузить большой файл в автоматическом скрипте с помощью 'wget', но 'прогресс', сгенерированный 'wget', слишком многословен.Например:

wget --progress=dot:mega 'http://mysite/my_large_file'

Для моего файла более 1,5 ГБ, при очень высокой скорости (> 9 МБ / с), даже при установке стиля прогресса на «мега», вывод по-прежнему слишком подробный:

     0K ........ ........ ........ ........ ........ ........  0% 2.03M 13m16s
  3072K ........ ........ ........ ........ ........ ........  0% 3.85M 10m7s
  6144K ........ ........ ........ ........ ........ ........  0% 3.85M 9m3s
  9216K ........ ........ ........ ........ ........ ........  0% 3.89M 8m30s

Но я не хочу завершать, чтобы отключить вывод прогресса, поскольку он позволяет мне узнать, есть ли какая-либо проблема.Теперь я использую «sed» для удаления точек:

wget --progress=dot:mega 'http://mysite/my_large_file' 2>&1 | sed -r 's/^ *([0-9]+K)[. ]*([0-9]+%) +([0-9.]+[A-Z]) +(.*)$/<\1,\2,\3\/s,remain:\4>, /g'

Вывод выглядит намного лучше:

<0K,0%,2.45M/s,remain:11m0s>,
<3072K,0%,9.13M/s,remain:6m58s>,
<6144K,0%,9.35M/s,remain:5m35s>,
<9216K,0%,9.37M/s,remain:4m54s>,
<12288K,0%,9.52M/s,remain:4m28s>,
<15360K,1%,9.42M/s,remain:4m11s>,

Теперь я хочу даже удалить символы «новой строки» в концекаждой линии, поэтому мой фреймворк автоматизации не будет ничего отбрасывать.Я пробовал 'td', 'awk', но все они не выводятся мгновенно.То есть, когда я использую «sed», он выводит строки, пока идет загрузка, но когда я использую «td» или «awk», я долго ждал, но ничего не выводилось.Я предполагаю, что он будет выводить весь документ, когда загрузка будет завершена, что бесполезно.

Так что мне интересно, есть ли способ удалить символы «новой строки» при мгновенном выводе потока.

Кстати, есть ли способ сделать вывод прогресса wget менее многословным, а не «no verbose».Например, печатайте каждые 10 МБ или 20 МБ на строку, или, если хотите, печатайте прогресс каждые, например, 10 секунд.

Как предлагается в комментариях, здесь я поместил желаемый вывод:

<0K,0%,2.45M/s,remain:11m0s>, <3072K,0%,9.13M/s,remain:6m58s>, <6144K,0%,9.35M/s,remain:5m35s>, <9216K,0%,9.37M/s,remain:4m54s>, <12288K,0%,9.52M/s,remain:4m28s>, <15360K,1%,9.42M/s,remain:4m11s>,

Весь вывод в одну строку.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Полагаю, вам нужно решить множество проблем:

  1. Буферизация канала. Принудительная буферизация строки stdout при подключении к тройнику
  2. печатает пространство шаблона, за которым всегда следует символ POSIX sed

Хитрость в том, чтобы unbuffer ваш канал , использовать для обработки строки, а printf - для записи в /dev/stdout с потенциальным сбросом.

Это будет что-то вроде:

$ stdbuf -oL -eL wget --progress=dot:mega 'http://mysite/my_large_file' 2>&1 \
  | awk '{printf c"<%s,%s,%s/s,remain:%s>",$1,$(NF-2),$(NF-1),$NF"; c=", "}END{print ""}'

Если вывод awk слишком медленный, вы можете добавить к нему дополнительный сброс.Но это особенность GNU awk:

$ stdbuf -oL -eL wget --progress=dot:mega 'http://mysite/my_large_file' 2>&1 \
  | awk '{printf c"<%s,%s,%s/s,remain:%s>",$1,$(NF-2),$(NF-1),$NF"; c=", "; fflush()}END{print ""}'

Я не уверен, нужно ли вам выравнивать буфер как /dev/stderr и /dev/stdout из-за перенаправления, но это не таквред сделать оба

0 голосов
/ 22 октября 2018

В дополнение к вашему sed, вам просто нужно передать tr инструкцию, дающую в конце:

wget --progress=dot:mega 'http://mysite/my_large_file' 2>&1 | sed -r 's/^ *([0-9]+K)[. ]*([0-9]+%) +([0-9.]+[A-Z]) +(.*)$/<\1,\2,\3\/s,remain:\4>, /g' |tr -d '\n'
...