Як забарвити вихідні стовпці ls?


8

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

Знімок екрана з виділеним синтаксисом фрагментом коду із пов'язаної відповіді


Ну, це акуратна ідея! Але на якій ОС ви працюєте?
JakeGould

2
Це, здається, є (неправильно) синтаксисом Bash, виділеним програмним забезпеченням SE. Схоже, він не забарвлений стовпцем, а цифри (цифри) отримують один колір, а все, що починається з великої літери, отримує інший. Забарвлення за стовпчиком можливо, але досить різна.
Боб

3
У загальному сенсі ви можете розділити вихід на роздільники стовпців за допомогою sedабо awkвставити послідовність аварійної передачі ANSI .
Боб

Пов’язано: superuser.com/q/665274
Тайсон

Я в підсистемі Windows 10 Ubuntu, але переходжу на macOS (зважаючи на повну катастрофу, якою виявився WinX ...)
Pirx,

Відповіді:


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, що має дати вам бажаний вихід:

Знімок екрана кольорового виводу


Дивовижні хлопці, це майже те, чого я хочу ;-) Мені, якщо серйозно, хотілося б додати ще один твіст і кольорові назви файлів. ls -al --color = auto зробив би це, але якщо я просто додати параметр --color до вищезазначених рішень, кольорові коди, здається, позбавляються. Чи можемо ми отримати якісь проблеми, щоб зберегти їх?
Піркс

Другий коментар, це більше викликає цікавість: у відповіді, на яку я посилався у своєму початковому запитанні, схоже, що 10basetom не використовував жодного з перерахованих вище, і все ж мав кольорові стовпці. Цікаво, чи це тому, що він використовував іншу версію ls чи якийсь фантазійний смарт-термінал?
Піркс

@Pirx Забарвлення у відповіді застосовується програмним забезпеченням Stack Exchange. Це не йде від їх терміналу. Це лише тому, що висновок був вставлений у блок коду, а в питанні був тег bash , який автоматично намагається застосувати підсвічування синтаксису Bash до будь-яких тегів коду у питанні та відповідях ... що насправді невірно в цьому випадку. З тієї ж причини рядки в коді в моїй відповіді червоні, хоча я навмисно їх не забарвлював.
Боб

1
@Pirx Використання --color=always. Поки ви не застосовуєте різні кольори до стовпця імен файлів ( $9у моєму прикладі), awkслід передати їх.
Боб

@Pirx Side примітка --color=always- це розширення GNU, тому якщо ви використовуєте систему, яка не є GNU (наприклад, macOS, інші BSD), вам потрібно буде встановити версію GNU або використовувати альтернативну .
Боб

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містять термінальні коди відповідно для чорного, червоного та синього кольорів. Ці коди розміщуються на початку будь-якого стовпця, який ми хочемо забарвити.

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


1
Так, добре закликати до визначення змінних. Не знав, що ти можеш це зробити зсередини awk! Я б запропонував вам включити шаблон для збереження вирівнювання стовпців :)
Боб

@Bob І мені подобається ваш FPATтрюк щодо правильності проміжку.
John1024
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.