команда `highlight`


11

Есть ли команда, которую можно использовать для простого выделения (цветом, жирным текстом или перевернутым задним / передним планом) определенных строк в stdin при передаче всей строки в stdout? Я думаю о его создании , но я бы предпочел просто использовать его, если он уже существует. Некоторые желательные особенности:

  1. Отдельные строки выделения подсвечиваются по-разному, автоматически. Например, первая строка будет выделена красным, вторая зеленым, третья синим без ручной настройки .
  2. Обнаруживает поддержку цвета и возвращается к жирному / инвертированному / другим методам выделения, где они доступны.
  3. Разрешить сопоставление регулярных выражений и буквенных строк.
  4. Предпочтительно делает что-то умное, если совпадения совпадают, такие как «foobar» и «barbar».
  5. Ничего не изменяется между стандартным вводом и стандартным выводом, кроме добавления цветовых кодов.


Ооо, хороший вопрос Мне нужна была именно эта вещь, и в итоге я написал что-то, но это были просто фиксированные строки с цветовой кодировкой, у него не было ни одной из перечисленных вами функций
Майкл Мрозек

Вместо того, чтобы писать новую утилиту, было бы здорово увидеть это как дополнение к самому grep.
Mattdm

1
Правильная философия Unix будет новой утилитой, которую можно передавать не только из grep, но и из других потоков. Я подозреваю, что есть по крайней мере один или несколько модулей Perl, которые могут сделать это для вас, хотя ...
Шадур

1
@Gilles: этот вопрос гораздо более ограничен по объему. На самом деле, чтение это было одной из причин, по которой я создал этот вопрос - попросить более общего и гибкого решения.
10

Ответы:


4

Может быть , универсальный колоризатор Радована Гарабика (grc) ? Он ожидает файл конфигурации в качестве аргумента и работает с регулярными выражениями. Так что не совсем без конфигурации, но вы можете использовать процесс process substitution ( <(list)), так что, безусловно, без ручной настройки :-)


Чтобы уточнить без необходимости открывать страницу (и сделать ее доступной для поиска), «this one» == Generic Colouriser ; GRC и grcat ... Спасибо, мне это нравится.
Peter.O

grcимеет вспомогательный скрипт: grcat. Вот пример окрашивания всех заглавных букв в красный. Шаг 1: Настройте файл конфигурации: printf "regexp=[A-Z]\ncolours=red\n" > ~/.grc/red-caps Шаг 2; Используйте его: echo Hello World | grcat red-caps... Страница man указывает 3 каталога конфигурации, которые она ищет, и затем предлагает (?), Что файл конфигурации может быть абсолютным путем, но этот последний метод поиска файла конфигурации работает только с относительными путями для меня (grc версия 1.3)
Peter.O

5

Sed на помощь!

Вы можете улучшить это (как это действительно нужно), но это работает довольно хорошо.

$ cat >~/bin/hilight <<EOF
#!/bin/bash
while [ $# -gt 0 ]
do
 COMANDO=$COMANDO's/'$1$'/\033[01;'$2$'m\033[K\\0\033[m\033[K/g\n'
 shift;shift;
done

sed -e "$COMANDO"
EOF

Для простоты, hilight принимает пару аргументов (сначала совпадение, затем цвет). В этом сценарии атрибут всегда выделен жирным шрифтом.

Прочтите man console_codes (Graphic Rendition), чтобы увидеть цветную защиту, или попробуйте это

for attrib in $(seq 0 12); do
  for color in $(seq 30 37) $(seq 40 47) $(seq 90 97); do
    printf %b " $attrib $color:\033[$attrib;${color}mhi, dudes\033[m"
  done
done

У этого есть важные недостатки, поскольку использование этого работает:

$ dmesg | hilight \\[ 34 ] 34

но это совсем не

$ dmesg | hilight \\[ 34 ] 34 [[:digit:]] 31

потому что [: digit:] находит числа в escape-последовательности предыдущих зарешений.

Что-то типа:

$ cat /var/log/kern.log | hilight kernel 31 a 34 et 33

всегда будет работать как исключено.

Используя команду времени, я нашел это увеличение в четыре раза за прошедшее время, что не слишком много.

Вы можете заменить команду sed на любой другой парсер, который вам нравится или соответствует вашим потребностям (awk и т. Д.)


2

Можно также использовать egrep с шаблоном, который соответствует каждой строке непечатаемого символа, например:

dmesg | egrep --color "swap|$"

1

клид работает отлично. Я использую его на RHEL 6.2, из репозитория EPEL


+1 за очень хороший инструмент. К сожалению, он не имеет всех запрашиваемых функций.
10

1

Если ваша версия grepпоставляется с окраской, то вы можете использовать регулярное выражение, чтобы grep выделил текст, а также соответствовал каждой строке, чтобы ничего не исключалось. Следующее должно сделать трюк:

<your command> |grep "highlightme\|^"

0

Как вы упомянули в ссылке, grep --color=alwaysработает только для одного шаблона. Тем не менее, я не верю, что такой инструмент существует.


0

Я использую http://em.readthedocs.org/ . Простота установки на различные платформы благодаря Python. Просто и отлично работает.


Добро пожаловать в Unix и Linux Stack Exchange! Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить сюда основные части ответа и предоставить ссылку для справки.
SLM

1
Согласно справочному центру : «Тем не менее, вы должны раскрывать свою принадлежность в ваших ответах». Если вы тот же Игорь Калницкий, который написал em, пожалуйста, перефразируйте ваш ответ, чтобы было ясно, что вы не пользователь, а автор предлагаемого инструмента.
manatwork
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.