2009-02-04 4 views
6

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

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

ответ

11

Произвести вывод tail -f в sed, а также добавить ANSI escape codes. Например, следующее будет раскрасить все номера в красный цвет (цвет 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" 
+0

Одна проблема: параметр -E вызывает ошибку? – nickf

+0

Вам нужно заменить -E на -e и выйти из всех круглых скобок. tail -f file | sed -e "s/\ ([0-9] + \)/$ RED \ 1 $ RESET/g; s/\ (\" [^ \ "] * \" \)/$ ЖЕЛТЫЙ \ 1 $ СБРОС/g " – itsadok

+0

-e не является строго необходимым. -E - это опция для использования расширенных регулярных выражений, так что вам не нужно выходить из круглых скобок, но, видимо, -E не доступен для всех версий sed. –

5

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

EDIT ОК, он получил:

Вот пример для вывода "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 темно-красный, «перо», используемое терминалом, теперь будет темно-красным. Это означает, что из этой точки вперед, весь текст, который будет отображаться на экране, будет dar k красный.

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

Для получения списка всех кодов эвакуации найдите [http://en.wikipedia.org/wiki/ANSI_escape_code Wikipedia] или просто зайдите в Google.

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

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

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

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

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

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

Какой бы цвет «Фев», «Мар», «Апрель» - каждый в темно-красный цвет.

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

+0

спасибо за подробный ответ! – nickf

3

Благодаря как scraimer и Адама, я придумал довольно много, что я был после того, как, и я думал, что я разделю это здесь для кого-либо еще:

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 "[email protected]\([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: \[email protected]" 

# here's the full line if you wanted to copy it 
# tail -f ~/access-logs/access.log | sed -e "[email protected]\([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: \[email protected]" 

который превращает этот:

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/