Как раскрасить выходные столбцы ls?

1370
Pirx

Название заголовка говорит само за себя: я хотел бы, чтобы эти аккуратные цветные столбцы выводили что-то вроде ls -al, скажем, ответа 10basetom на этот вопрос .

Screenshot of syntax-highlighted code snippet from linked answer

8
Ну, это хорошая идея! Но на какой ОС ты? JakeGould 6 лет назад 0
Это выглядит (неправильно) синтаксис Bash, выделенный программным обеспечением SE. Похоже, что он не раскрашен по столбцам, а цифры (цифры) получают один цвет, а все, что начинается с заглавной буквы, - другой. Раскраска для столбца выполнима, но отличается. Bob 6 лет назад 2
В общем смысле вы можете разделить вывод на разделители столбцов с помощью `sed` или` awk` и вставить [escape-последовательность ANSI] (https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_ (Select_Graphic_Rendition) _parameters ). Bob 6 лет назад 3
Связанный: https://superuser.com/q/665274 Tyson 6 лет назад 0
Я нахожусь в подсистеме Ubuntu Windows 10, но перехожу на macOS (учитывая полное бедствие, что WinX оказался ...) Pirx 6 лет назад 0

2 ответа на вопрос

8
Bob

Это выполнимо с awk. К сожалению, поскольку формат ls -lне определен, невозможно найти решение, которое будет работать в каждой системе, поэтому в некоторых системах потребуется некоторая настройка того, какой цвет использовать для какого столбца.


Прежде всего, мы хотим сохранить оригинальные пробелы, используемые ls -l. В противном случае выравнивание столбца будет неправильным. Мы можем сделать это с помощью FPATопции, благодаря такому ответу :

ls -la | awk ' BEGIN { FPAT = "([[:space:]]*[^[:space:]]+)"; OFS = ""; } 

В awk, каждый позиционный параметр ( $1, $2и т. Д.) Относится к одному полю, то есть к одному столбцу в текущей строке. То, что было FPATсделано выше, это переопределение каждого поля, чтобы включить все предыдущие пробелы, поэтому при printего возврате он сохраняет пробелы, чтобы столбцы оставались в том же положении.

Теперь мы можем просто отредактировать каждое поле, чтобы вставить код цвета, а затем распечатать отредактированный вывод:

 { $2 = "\033[31m" $2 "\033[0m"; $3 = "\033[36m" $3 "\033[0m"; $4 = "\033[36m" $4 "\033[0m"; $5 = "\033[31m" $5 "\033[0m"; $6 = "\033[36m" $6 "\033[0m"; $7 = "\033[36m" $7 "\033[0m"; $8 = "\033[31m" $8 "\033[0m"; print } ' 

Обратите внимание, что каждый столбец сбрасывается обратно по умолчанию ( 0между [и m) впоследствии. Если вы хотите, чтобы цвет проходил через несколько столбцов, вы можете пропустить этот код. Лично я предпочитаю указывать каждый столбец независимо.


Вы можете определить команду многократного использования в вашем .bashrc. Например:

lsc() { ls -la | awk ' BEGIN { FPAT = "([[:space:]]*[^[:space:]]+)"; OFS = ""; } { $2 = "\033[31m" $2 "\033[0m"; $3 = "\033[36m" $3 "\033[0m"; $4 = "\033[36m" $4 "\033[0m"; $5 = "\033[31m" $5 "\033[0m"; $6 = "\033[36m" $6 "\033[0m"; $7 = "\033[36m" $7 "\033[0m"; $8 = "\033[31m" $8 "\033[0m"; print } ' } 

Вам может потребоваться перезапустить bashсеанс (или запустить source ~/.bashrc), чтобы запустить определение этой функции.

Отсюда вы можете просто позвонить lsc, чтобы получить желаемый результат:

Screenshot of coloured output

Крутые ребята, это * почти * то, что я хочу ;-) Серьезно, я хотел бы добавить еще один поворот и покрасить имена файлов. ls -al --color = auto сделает это, но если я просто добавлю опцию --color к вышеупомянутым решениям, цветовые коды, похоже, будут удалены. Можем ли мы получить awk, чтобы сохранить их? Pirx 6 лет назад 0
Второй комментарий, это скорее из любопытства: в ответе, на который я ссылался в своем первоначальном вопросе, похоже, что 10basetom не использовал ничего из вышеперечисленного и все еще имел цветные столбцы. Интересно, потому что он использовал другую версию ls или какой-нибудь модный смарт-терминал? Pirx 6 лет назад 0
@Pirx Цвет в ответе применяется программным обеспечением Stack Exchange. Это не из их терминала. Это просто потому, что вывод был вставлен в блок кода, и вопрос имел тег [tag: bash], который автоматически пытается применить подсветку синтаксиса Bash к любым тегам кода в вопросе и ответах ... что на самом деле неверно в этом случае , По той же причине строки в коде красного цвета в моем ответе, хотя я специально не окрашивал их. Bob 6 лет назад 0
@Pirx Используйте `--color = always`. Пока вы не применяете разные цвета к столбцу имени файла (в моем примере `$ 9`), awk должен их пропустить. Bob 6 лет назад 1
Замечание @Pirx: `--color = всегда` является расширением GNU, поэтому если вы работаете не в системе GNU (например, macOS, другие BSD), вам нужно либо установить версию GNU, либо использовать [альтернативный вариант] (https://unix.stackexchange.com/a/72804/33227). Bob 6 лет назад 0
Ха, спасибо, это делает трюк. Я установил GNU coreutils (и пару других, включая последнюю версию bash) на мой Mac, так что я хорош в этом. Pirx 6 лет назад 0
6
John1024

Это напечатает второй столбец ls -alFкрасным цветом, третий - восьмой - синим, а девятый - черным:

ls -alF | awk -v black=$(tput setaf 0) -v red=$(tput setaf 1) -v blue=$(tput setaf 4) '{$2=red $2; $3= blue $3; $9=black $9} 1' 

Это только в качестве примера. Вы можете настроить это по своему усмотрению.

Для тех, кто предпочитает их код в несколько строк:

ls -alF | awk -v black=$(tput setaf 0) \ -v red=$(tput setaf 1) \ -v blue=$(tput setaf 4) \ '{ $2=red $2 $3= blue $3 $9=black $9 }  1' 

подробности

tputутилита для генерации разнообразных управляющих кодов для вашего терминала Например, tput setaf nзадает цвет переднего плана, nгде nможет варьироваться от 0 до 7

0 – Black 1 – Red 2 – Green 3 – Yellow 4 – Blue 5 – Magenta 6 – Cyan 7 – White 

Вы можете прочитать больше о tputего цветовых возможностях здесь .

Код AWK определяет переменные black, redи blueкоторые содержат концевые коды черный, красный и синий, соответственно. Эти коды размещаются в начале любого столбца, который мы хотим раскрасить.

Одна хитрость в том, что цветовые коды не сбрасываются самостоятельно. Таким образом, независимо от того, какой последний цвет вы укажете в одной строке, будет использоваться цвет по умолчанию для следующей строки, если не указана другая цветовая команда.

Хорошо, хороший вызов для определения переменных. Не знал, что ты можешь сделать это изнутри `awk`! Я бы посоветовал вам включить шаблон, чтобы сохранить выравнивание столбцов :) Bob 6 лет назад 1
@Bob И мне нравится твой трюк `FPAT` для поддержания правильного расстояния. John1024 6 лет назад 0