Чтобы отслеживать файл журнала, я использую следующую команду: tail -f -n 1 myfile.log | perl -ne 'print if s/progress (\d+).*/$1%/g'
Это создаст линии с номером в моем терминале. Как изменить эту команду, чтобы переписать последнюю строку? Добавление \r\033[K
не делает этого: tail -f -n 1 myfile.log | perl -ne 'print if s/progress (\d+).*/`\r\033[K$1%/g'
Как переопределить последнюю строку с хвостом?
0
A
ответ
4
Когда вы читаете строку в Perl, конечный символ новой строки не разделяется. Кроме того, .
в регулярном выражении не соответствует символу новой строки, если отсутствует модификатор s
. Таким образом, во втором фрагменте символ \r
всегда печатается как первый символ в строке и, следовательно, не имеет никакого эффекта.
Чтобы исправить это, можно сделать следующее:
- Добавьте модификатор
s
в регулярное выражение для удаления символа новой строки, а также. - Перед печатью строки напечатайте символ
\r
, чтобы перейти к первой позиции в строке. - С
STDOUT
буферизируется в строке, вам нужно изменить его на автоматическое очищение каждый раз, когда что-то напечатано. Это можно сделать, назначив1
по номеру$|
.
Окончательный код:
perl -ne '$|=1; print if s/progress (\d+).*/\r$1%/s'
+0
Ницца! Спасибо! –
Что означает "последняя строка" означает, если вы используете 'хвост -f'? – Sobrique
Моя команда генерирует вывод следующим образом: 56 (newline) 57 (newline) 58 (newline) 59 ... и я хочу видеть только последний номер. В этом случае 59. –
Да. Но 'tail -f' продолжает работать и не отправляет' eof' - поэтому 'perl' не может знать, когда это _is_« последняя строка », потому что может быть другой. – Sobrique