передать команду, которая не печатает новую строку (но использует \ r) - PullRequest
0 голосов
/ 26 июня 2019

Я хочу передать вывод программы, которая не печатает новую строку, поскольку она использует возврат каретки для замены своей строки новым содержимым.

этот код представляет поведение программы, которую я хотел быдля получения выходных данных.

#!/usr/bin/env bash                                                             

for i in {1..100};do                                                            
    echo -ne "[ $i% ] long unneeded log\r"                                            
    sleep 0.3                                                                   
done

Я хотел бы, в сценарии bash, вырезать этот вывод в реальном времени, чтобы отображать только важную информацию, но, поскольку программа не печатает перевод новой строки, ./program | awk ... показываетвывод только после завершения команды.

Я не могу изменить программу, которая выдает этот вывод, который я пытаюсь обрезать.(У меня нет его источника + я хочу поделиться своим собственным сценарием с другими пользователями)

Я знаю, что мой запрос довольно специфичен, но есть ли способ передать выводимый символ за символом вместо строки за строкой

Ответы [ 3 ]

0 голосов
/ 26 июня 2019

Измените вашу команду эха с:

echo -ne

На:

echo -e

Из документов эха:

‘-n’
     Do not output the trailing newline.
0 голосов
/ 26 июня 2019

Я нашел его благодаря сочетанию ответа @OznOg и ссылки @ Walter-A.

действительно замена каретки на новую строку с tr работает, но по умолчанию буферизуется, stdbuf может отменить буфер с помощью stdbuf -o0.

, поэтому последняя команда:

./program | stdbuf -o0 tr '\r' '\n' |  awk -F'[][]' '{printf $2 "\r"}'

это действительно печатает вживую первое совпадение в скобках с возвратом каретки.

таким образом, текущий журнал программы, отображаемый в одной обновленной строке [x%] long compile detail, будет сокращен до x%, все еще используя 1 строку.

0 голосов
/ 26 июня 2019

вы можете попробовать

./program | tr '\r' '\n'

вы можете продолжить работу с третьей программой, которая будет обрабатывать строку на строку.

...