Применить форматирование к оболочке Unix - PullRequest
7 голосов
/ 04 февраля 2009

Я недавно просматривал некоторые журналы сервера, используя tail -f, и подумал, что было бы намного легче увидеть некоторые вещи, если бы я мог отформатировать вывод. На самом деле все, что я ищу, - это, возможно, способ раскрасить определенные слова (определяемые регулярным выражением) и, возможно, удалить определенные слова (опять же, определенные регулярным выражением).

Я знаю есть программы, которые визуализируют журналы сервера в реальном времени и еще много чего, но меня это больше интересует.

Ответы [ 3 ]

12 голосов
/ 04 февраля 2009

Перенаправить вывод tail -f в sed и добавить несколько управляющих кодов ANSI . Например, следующий код раскрасит все числа в красный (цвет 31), а все строки в кавычках - в ярко-желтый (цвет 93):

RED=`echo -en '\e[31m'`
YELLOW=`echo -en '\e[93m'`
RESET=`echo -en '\e[00m'`
tail -f file | sed -E "s/([0-9]+)/$RED\1$RESET/g;s/(\"[^\"]*\")/$YELLOW\1$RESET/g"
5 голосов
/ 04 февраля 2009

Я думаю, что вы ищете какой-то скрипт sed, который будет окружать слова, которые вы выбираете, с помощью escape-последовательностей ANSI Color. (хм ... дай мне посмотреть).

РЕДАКТИРОВАТЬ ОК, получил:

Вот пример для вывода «Hello» темно-красным:

echo -e "\033[31mHello\033[0m"

Что происходит? Прежде всего, я использую echo -e, чтобы echo не преобразовывал косые черты в экранные косые черты, а скорее считывал escape-последовательность \033 как один экранированный символ. На самом деле это только 33 в восьмеричном, что составляет 27 (порядковый номер для ключа ESC).

То, что действительно отправляется на экран, выглядит примерно так:

<ESC>[32mHello<ESC>[0m

Что на дисплее ANSI интерпретируется как «сначала выполните команду 32m, выведите« Hello », а затем выполните команду 0m.

В этом случае команда 32m означает «установить цвет переднего плана на 2», и, поскольку цвет # 2 темно-красный, «ручка», используемая терминалом, теперь будет темно-красной. Это означает, что с этого момента весь текст, который будет отображаться на экране, будет темно-красным.

Когда мы закончим вывод текста, который должен быть красным, мы хотим сбросить цвета, поэтому мы вызываем команду 0m, которая сбрасывает цвета до нормальных.

Список всех кодов перехода можно найти в [http://en.wikipedia.org/wiki/ANSI_escape_code Википедии] или просто в Google.

Итак, все, что нужно сделать вашему сценарию sed, это заменить слова, которые вы выбрали, словами, окруженными цветами. Например, чтобы заменить слово «Feb» в /var/log/messages, выполните следующее:

tail /var/log/messages | sed -e "s/Feb/\\o033[31m&\\o033[0m/"

(Возможно, вам придется сделать это как root, чтобы действительно прочитать /var/log/messages)

Все, что сделал sed, - это поиск слова "Feb" и окружение его той же escape-последовательностью, что мы использовали выше.

Вы можете расширить его, чтобы раскрасить несколько слов:

tail /var/log/messages | sed -e "s/\(Feb\|Mar\|Apr\)/\\o033[31m&\\o033[0m/g"

Какие цвета "Фев", "Мар", "Апр" - каждый темно-красный.

Надеюсь, это даст вам представление о том, как делать то, что вам нужно!

3 голосов
/ 04 февраля 2009

Благодаря Скреймеру и Адаму, я придумал почти то, что хотел, и подумал, что поделюсь этим здесь для всех:

RED=`echo -en '\e[31m'`
YELLOW=`echo -en '\e[93m'`
RESET=`echo -en '\e[00m'`

# line breaks here are just for formatting
tail -f ~/access-logs/access.log | sed -e "s@\([0-9\.]\+\) - - 
    \[[0-9]\+/[a-zA-Z]\+/[0-9]\+:\([0-9]\+:[0-9]\+:[0-9]\+\) +[0-9]\+] \"
    \(.\+\) HTTP/1\.[01]\" \([0-9]\+\) \([-0-9]\+\) \"\([^\"]\+\)\".*
    @\n\2 $YELLOW\4$RESET (\1)\n$RED\3$RESET\nBytes: \5\nFrom: \6@g"

# here's the full line if you wanted to copy it
# tail -f ~/access-logs/access.log | sed -e "s@\([0-9\.]\+\) - - \[[0-9]\+/[a-zA-Z]\+/[0-9]\+:\([0-9]\+:[0-9]\+:[0-9]\+\) +[0-9]\+] \"\(.\+\) HTTP/1\.[01]\" \([0-9]\+\) \([-0-9]\+\) \"\([^\"]\+\)\".*@\n\2 $YELLOW\4$RESET (\1)\n$RED\3$RESET\nBytes: \5\nFrom: \6@g"

Что превращает это:

182.108.1.20 - - [04/Feb/2009:23:24:41 +1000] "GET /images/exam_room.jpg HTTP/1.0" 200 8559 "http://www.myserver.com/courses/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"

В это (но с некоторым цветом):

23:24:41 200 (182.108.1.20)
GET /images/exam_room.jpg
Bytes: 8559
From: http://www.myserver.com/courses/
...