8

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

Снимок экрана: фрагмент кода с выделенным синтаксисом из связанного ответа

2 ответа2

8

Это выполнимо с 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 , что даст вам желаемый результат:

Снимок экрана цветного вывода

6

Это напечатает второй столбец 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 которые содержат коды клемм для black, red и blue соответственно. Эти коды размещаются в начале любого столбца, который мы хотим раскрасить.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .