Предотвратить поломку часов

Предотвратить поломку часов

Я изменяю скрипты на работе, которые отслеживают файлы журналов, чтобы выделить определенные элементы и раскрасить их. Окончательный вывод — это список 6-значных чисел в нескольких столбцах. Мне удалось добавить a ~в начало числа, и это ничего не сломало в окончательном выводе, но это довольно уродливо и трудночитаемо. Однако, когда я пытаюсь раскрасить число, либо в предыдущих скриптах bash, либо при окончательной обработке данных в скрипте perl, цветной текст затирается.

Например, исходное число, которое я подставлю $num:

123456

Я ввожу это в Perl (или, что то же самое, в Bash):

"\e[1;34m" . $num . "\e[0m"

И вот что я получаю:

[1;34m123456[0m 

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

"\x1B[1;34m" . $num . "\x1B[0m"

Если это имеет значение, вот настоящая стопка скриптов (она в беспорядке):

  • Perl вызывается внутри скрипта оболочки, который затем передается в grep/ cut/etc.
  • скрипт оболочки с дополнительными файлами cut/etc., затем перенаправляется в .pl
  • скрипт оболочки отслеживает этот вывод

Может быть, watchему не нравится цвет?

Я не perlочень хорошо разбираюсь, поэтому, думаю, не помешает показать, что я вижу вокруг линий печати:

my $format = ("%-8s") x scalar(@{$a[0]});

printf("$format\n", @$_)

решение1

Я столкнулся с проблемой «кражи цвета»смотреть, это потому, что watch использует простой стиль вывода /bin/sh, который затмевает любые цвета, псевдонимы, сочетания клавиш... всю эту ерунду!

Итак, я слепил это вместе, поместил в свой.bashrc, позволяет мне использовать все мои собственные псевдонимы, сочетания клавиш и т. д.:

Usage:
    watcher 20 'somecommand | apipe | grep'

Число — это задержка между обновлениями в секундах, команда может включать в себя все, что вы можете указать в кавычках.

###### 'watch' workalike, lets me use my aliases and such
function watcher() { WATCHERTIME=$1 ; WATCHERFILE=/tmp/watcher$$ ; shift ; while true ; do WATCHERHEIGHT=$(($LINES - 5)) ; ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null; clear ; /bin/echo -n "Every ${WATCHERTIME} seconds - " ; date ; /bin/echo ; cat ${WATCHERFILE} ; \rm -f ${WATCHERFILE} ; /bin/echo ; /bin/echo "==" ; sleep ${WATCHERTIME} ; done ; }

Если разбить это на части:

function watcher()
{ 
  WATCHERTIME=$1
  WATCHERFILE=/tmp/watcher$$
  shift
  while true; do
    WATCHERHEIGHT=$(($LINES - 5))
    ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null
    clear
    /bin/echo -n "Every ${WATCHERTIME} seconds - "
    date
    /bin/echo
    cat ${WATCHERFILE}
    \rm -f ${WATCHERFILE}
    /bin/echo
    /bin/echo "=="
    sleep ${WATCHERTIME}
  done
}

Он определяет текущую высоту экрана в строках, вычитает достаточно для собственного вывода, затем многократно выполняет заданную команду, затем очищает экран, отображает вывод и ждет следующего цикла. Он отображает короткий '==' внизу, чтобы обозначить, что здесь вывод закончился. Иногда полезно знать это.

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

Поскольку он не искажает цвета, вы получаете все, к чему привыкли. Наслаждайтесь!

решение2

Проблема в том, что watchиспользует Curses и cursesфункции вывода строк работают на виртуальном буфере кадров с отдельными плоскостями для символов и их атрибутов/цветов. Строки отправляются в буфер кадров как есть, без интерпретации директивы терминала. Чтобы защититься от затирания состояния терминала, Curses игнорирует ESC(помимо прочего), поэтому watchне будет делать цвет по умолчанию.

Вы можете исправить это, следуя мудрым советамjw013илилорникс: либо используйте watch --color, либо оберните свой скрипт во что-то вроде while true; do clear; $SCRIPT; sleep 2; doneцикла.

решение3

Вероятно, вам понадобится --colorопция watch.

Связанный контент