2015-10-26 5 views
0

Чтобы отслеживать файл журнала, я использую следующую команду: 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' Как переопределить последнюю строку с хвостом?

+1

Что означает "последняя строка" означает, если вы используете 'хвост -f'? – Sobrique

+0

Моя команда генерирует вывод следующим образом: 56 (newline) 57 (newline) 58 (newline) 59 ... и я хочу видеть только последний номер. В этом случае 59. –

+2

Да. Но 'tail -f' продолжает работать и не отправляет' eof' - поэтому 'perl' не может знать, когда это _is_« последняя строка », потому что может быть другой. – Sobrique

ответ

4

Когда вы читаете строку в Perl, конечный символ новой строки не разделяется. Кроме того, . в регулярном выражении не соответствует символу новой строки, если отсутствует модификатор s. Таким образом, во втором фрагменте символ \r всегда печатается как первый символ в строке и, следовательно, не имеет никакого эффекта.

Чтобы исправить это, можно сделать следующее:

  1. Добавьте модификатор s в регулярное выражение для удаления символа новой строки, а также.
  2. Перед печатью строки напечатайте символ \r, чтобы перейти к первой позиции в строке.
  3. С STDOUT буферизируется в строке, вам нужно изменить его на автоматическое очищение каждый раз, когда что-то напечатано. Это можно сделать, назначив 1 по номеру $|.

Окончательный код:

perl -ne '$|=1; print if s/progress (\d+).*/\r$1%/s' 
+0

Ницца! Спасибо! –