bash: раскрасить второй столбец вывода

8

скажем, у меня есть следующий вывод из ls:

$ ls -lAhF /bin
-rwxr-xr-x 1 root root 905K Apr 10  2010 bash*
-rwxr-xr-x 3 root root  31K Dec 26  2011 bunzip2*
-rwxr-xr-x 1 root root 505K Nov 15  2010 busybox*
-rwxr-xr-x 3 root root  31K Dec 26  2011 bzcat*
lrwxrwxrwx 1 root root    6 Jun 24  2012 bzcmp -> bzdiff*
...

Я ищу способ, как я мог бы раскрасить второй столбец. Я знаю, как использовать sed, чтобы раскрасить любой шаблон, но я не знаю, как раскрасить определенный столбец. В основном, мне нужно вставить '\033[0;31m'после первого пробела и '\033[0m'перед вторым пробелом. Или, может быть, есть гораздо более элегантный способ?

user1968963
источник
1
некрасиво:ls --color -l | sed -e $'s/ *[^ ]* /\033[0;31m&\033[0m/'
frostschutz

Ответы:

10

С grepпредоставленной GNU он был собран с поддержкой PCRE :

ls -l | GREP_COLORS='mt=1;41;37' grep --color -P '^\S+\s+\K\S+'

С sed:

on=$(tput setaf 7; tput setab 1; tput bold) off=$(tput sgr0)
ls -l | sed "s/[^[:blank:]]\{1,\}/$on&$off/2"

Обратите внимание, что использование setafпредполагает, что терминал поддерживает escape-последовательности ANSI, поэтому вы можете также жестко его кодировать, что также сделает его менее многословным. Вот с ksh93(также bashи zsh) синтаксисом:

on=$'\e[1;47;37m' off=$'\e[m'

Для обобщения на n- й столбец:

n=5

GREP_COLORS='mt=1;41;37' grep --color -P "^(\S+\s+){$(($n-1))}\K\S+"

sed "s/[^[:blank:]]\{1,\}/$on&$off/$n"

Ссылки

Стефан Шазелас
источник
grep -PЭто фантастично. Большое спасибо.
user1968963
6

Что-то вроде этого?

awk -v on="$(tput bold)" -v off="$(tput rmso)" '{ $2=on $2 off }; 1'

Изменить: используйте правильные tputподкоманды.

tripleee
источник
Настройка $1нарушит выравнивание столбцов.
Стефан Шазелас
2
Строго говоря, rmsoстоит отменить, smsoхотя (режим ожидания) нет bold. На многих терминалах ( tput rmsoникак не отменить tput bold).
Стефан Шазелас