понедельник, 18 января 2010 г.

Подсветка строк

Задумался я недавно. Вот grep есть, красиво подсвечивает строки, но всё остальное, что не попало под шаблон, не показывает. А мне захотелось, что бы показывало всё, а кое какие строки даже и подсвечивались.
Сказано - сделано. Полез в гугль, покопался и нашёл что-то похожее на правду: утилиту hlstring. Единственный недостаток - в ебилдах я её не нашёл, поэтому пришлось наморщить ум.

Результатом морщения оного стал вот такой скриптик:


#!/bin/bash

IN_COLOR="^[[0;31;40m"
OUT_COLOR="^[[0;37;40m"

[[ $1 == "" ]] && echo "Usage: $0 [-c color] [--raw-cond] " && exit

while [[ $2 != "" ]]; do
[[ $1 == "--" ]] && shift && break

if [[ $1 == "-c" ]]; then
IN_COLOR="^[[0;$2;40m"
shift
continue
fi

if [[ $1 == "--raw-cond" ]]; then
RAW_COND=true
fi

shift
done

if [[ $RAW_COND == "" ]];then
SED_COND="/$1/"
else
SED_COND="$1"
fi

sed -re "${SED_COND} s/(.*)/$IN_COLOR\1$OUT_COLOR/"

Ну, что тут и как понять вроде не сложно. Ищем sed-ом строки и обрамляем ESC кодами. Коды забиты в шаблон поэтому не факт, что оно будет правильно работать на всех терминалах. Но на xterm - вполне.

Закатал его в файлик highlight.sh, и добавил alias в zsh - hl.

Пример использования:
leela ~ # iptables -L -v | hl eth0 | hl -c 33 --raw-cond 1,2
Выводим правила iptables
Подсвечиваем строки, содержащие eth0 (по умолчанию красным)
И подсвечиваем первую и вторую строку цветом 33 (им оказался жёлтый).
-c как вы поняли цвет, --raw-cond задаёт условие выбора строк в sed как есть (по умолчанию обрамляется /)

Вот даже и картинку сделал:


P/S/ Кстати, можно видеть, что через eth0 я скачал 19 метров (это примерно за сутки) платного трафика, а через бесплатный гостевой доступ уже 3.8 Гига. Похоже больше трафик не крадут ;) А ещё похоже, что первые 4 правила вообще не нужны.

З.Ы.Ы. Если кто захочет скопировать скрипт, то он у вас не заработает. Чтоб сработал надо везде в тексте заменить ^[ на реальный символ ESC. В консоли(и в vim-е тоже) он вводится путём нажатия Ctr+V и затем ESC.

Комментариев нет: