Как настроить цветной вывод?

18

Я хотел условно отформатировать файлы Unix, сейчас я работаю над diffкомандой и хотел узнать, возможно ли отформатировать текст diffвывода команды.

Пример:

Соответствующие значения должны отображаться зеленым цветом.
Несоответствующие значения должны отображаться красным цветом.

Предположим , у меня есть два файла file1и file2и моя команда diff file1 file2.

Теперь я хотел, чтобы выходные данные содержали 5 несоответствий, тогда эти несоответствия должны отображаться красным цветом. Как добиться этого с помощью Unix?

Короче говоря "Измените цвет на красный для вывода команды diff для значений, которые не соответствуют"

Мужчина
источник
2
Возможная
копия
Термины «матч» и «mismach» немного сбивают с толку. В любом случае, есть опция --color теперь в diff 3.4 и позже.
Джерри Lufwansa

Ответы:

24

diff --color добавлена ​​опция GNU diffutils 3.4 (2016-08-08)

Это diffреализация по умолчанию на большинстве дистрибутивов, которые скоро получат ее.

На 3.5 это выглядит так:

введите описание изображения здесь

с:

diff --color -u \
  <(seq 6 | sed 's/$/ a/') \
  <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')

Я также запросил различие в уровне слов, начиная diff-highlightс: [Diffutils-devel] Добавить флаг для получения цветного вывода, такого как git's diff-h | lists.gnu.org

Очевидно, добавлено в коммит c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (март 2015).

Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
источник
1
Отлично! Чтобы включить это по умолчанию: alias diff='diff --color=auto'
Том Хейл
1
Вот документация.
Алексей
19

Если у вас есть доступ к GNU, diffвы можете использовать его --X-group-formatпараметры, чтобы получить этот эффект без каких-либо дополнительных инструментов:

diff --old-group-format=$'\e[0;31m%<\e[0m' \
     --new-group-format=$'\e[0;31m%>\e[0m' \
     --unchanged-group-format=$'\e[0;32m%=\e[0m' \
     file1 file2

При этом используются экранирующие коды цвета ANSI для получения красного и зеленого цветов, а в оболочке указывается ANSI-C для доступа к \eвыходам.

--old-group-formatи --new-group-formatопределить несоответствующие строки и вставить их между красным и цветным кодами сброса, используя %<и %>, в то время как вставьте --unchanged-group-formatсовпадающие линии между зеленым и кодами сброса.

Вы можете также использовать--old-line-format ( и т.д.), за счет избыточных цветовых побегов в каждой строке: --old-line-format=$'\e[0;31m%L\e[0m'.

Майкл Гомер
источник
когда я запускаю, это дает diff: 0653-821 недопустимую опцию - - diff: 0653-821 недопустимая опция - o diff: 0653-821 недопустимая опция - d diff: 0653-821 недопустимая опция - - diff: 0653-821 Недопустимая опция - g diff: 0653-821 Недопустимая опция - o подобные ошибки.
Аман
Ужаснее, когда я запускаю ваши команды по одной строке за раз, она не выдает новой строки -bash-4.2 $ --new-group-format = $ '\ e [0; 31m%> \ e [0m' \ >
Аман
Могу ли я настроить это по умолчанию?
Евгений Коньков
@EugenKonkov Вы можете настроить псевдоним или функцию в вашей оболочке, чтобы запустить его diff.
Майкл Гомер
Это доставило мне немало хлопот, пытаясь заставить его работать. Неизменный материал показывался как добавленный ... сдался и установил colordiff
Брайан Петерсон
9

Пытаться colordiff file1 file2

Доступность colordiff с вашим дистрибутивом Linux / BSD

Те, кто работает с Debian или Ubuntu (или любым из их производных), могут просто использовать «apt-get install colordiff» для загрузки и установки; Colordiff также поставляется для ряда других дистрибутивов и операционных систем Linux, UNIX и BSD.

(Цитата из http://www.colordiff.org/ )

Модесто
источник
1
Отлично. Для меня diff --color=autoбыли только цветные линии маркеров и первая строка каждого +/ -раздела. Трубопровод less -SRдля облегчения просмотра.
Уолф
4

Цветной вывод на уровне слов diff

Вот что вы можете сделать с помощью приведенного ниже сценария и diff-highlight :

Цветной разностный скриншот

#!/bin/sh -eu

# Use diff-highlight to show word-level differences

diff -U3 --minimal "$@" |
  sed 's/^-/\x1b[1;31m-/;s/^+/\x1b[1;32m+/;s/^@/\x1b[1;34m@/;s/$/\x1b[0m/' |
  diff-highlight

( Благодарим за ответ @ retracile за sedвыделение)

Том Хейл
источник
1

Вы должны взглянуть на hlкоманду, доступную на github: git clone http://github.com/mbornet-hl/hl и на: http://www.flashnux.com/notes/page_000022_US.html

hlэто команда Linux, написанная на C, специально разработанная для раскрашивания текстового файла или вывода команды. Вы можете использовать до 42 цветов одновременно и использовать файл конфигурации для упрощения командной строки. Вы можете раскрасить вывод каждой команды, которая может быть передана другой. И если вы знаете, что такое регулярные выражения, вам будет очень легко пользоваться. Вы можете использовать manстраницу, чтобы понять, как ее использовать.
hlочень прост в использовании и настройке. Вы даже можете использовать скрипт hl_generic для раскрашивания выводимых команд без изменения их синтаксиса.
Например, вы можете раскрасить вывод diffкоманды, просто набрав вашу обычную команду:

diff file1 file2

Если вам нужна помощь, просто пришлите мне по электронной почте.
С уважением.

mbornet
источник
1

На данный момент на Github есть действительно удобный инструмент, созданный с помощью python icdiff. Создает приятные цветные выходы, которые также знают о «серьезности». Я использую это все время, хорошо стоит проверить.

Джо Хили
источник
1

если у вас установлен vim, вы можете сделать diff file1 file2 | vim -

Vim распознает формат diff и придаст ему правильную окраску. Черта в конце должна позволить vim принимать ввод от команды diff.

TrongBang
источник
'view' (доступный только для чтения ярлык для vim) лучше подходит для этой цели.
Анупам Шривастава
1

Установите универсальный колоризатор ( grc ) и:

grc diff file1 file2

Доступно как в Linux, так и в MacOS.

Сохаил Си
источник
0

Либо вы можете использовать

1.diff --color=auto file1 file2

2.colordiff file1 file2

3. Мой любимый: git diff file1 file2 реализовано как ниже:

В настоящее время я использую и рекомендую , используя git diff или передавая свой вывод с colordiffпомощью:

diff() { git diff --no-index "$1" "$2" | colordiff; }

himanshuxd
источник
Мне git diff --no-indexтоже нравится, но я думаю, что файлы должны быть доступны для поиска. (По крайней мере, у меня не работает замена процесса bash)
Карл
@Karl Подумайте сами, возможно, есть настройка Terminal, которая делает это (или) каким-то другим способом, чтобы сделать его доступным. Я давно пользуюсь, git diffи файл для меня можно найти, иначе не было бы смысла делать это правильно.
himanshuxd
2
Возможно, я не был ясно, очень ясно. Как (глупый) пример, это работает для меня, diff --color <(ls | head -n+3) <(ls | tail -n +5)но не с git diff. По общему признанию, не частый случай или слишком трудно обойти.
Карл
0

Просто примечание: для получения «параллельного» вывода вам нужно «--color = always». Вы также можете разбить его на страницы с меньшим количеством и сохранить цветной вывод:

diff -y --color=always file1 file2 | less -R

И еще одна подсказка: попытайтесь сохранить переключатель «--color = всегда» в конце. Причина? С помощью dmesg из util-linux 2.27.1:

dmesg --human --color=always | less -R    # works
dmesg --color=always --human | less -R    # doesn't work
Гас
источник
0

Этот скрипт использует стандартную версию до версии 3.4 diff (он должен работать с любой версией diff) и раскрашивает выходные данные без какого-либо изменения формата вывода. Он работает с последней версией RHEL (версия 7.5), которая имеет GNU diff версии 3.3. Просто поместите его в каталог ~ / bin или в любое другое место вашего пути (я предлагаю называть его "cdiff").

#!/bin/bash
file1color="$(tput setaf 1)"
file2color="$(tput setaf 2)"
sepcolor="$(tput setaf 6)"
reset="$(tput sgr0)"
diff $* |sed -e "s/^\\(<.*\$\\)/$file1color\\1$reset/;s/^\\(>.*\$\\)/$file2color\\1$reset/;s/^\\(---\$\\)/$sepcolor\\1$reset/"
Бим Дэвис
источник