bash: colorir a segunda coluna de saída

8

digamos, eu tenho a seguinte saída de 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*
...

Eu estou procurando uma maneira, como eu poderia colorir a segunda coluna. Eu sei como usar o sed para colorir qualquer padrão, mas não sei como colorir uma coluna específica. Basicamente, eu preciso inserir '\033[0;31m'após o primeiro espaço e na '\033[0m'frente do segundo espaço. Ou talvez haja uma maneira muito mais elegante?

user1968963
fonte
1
feio:ls --color -l | sed -e $'s/ *[^ ]* /\033[0;31m&\033[0m/'
frostschutz 26/05

Respostas:

10

Com o GNU grepfornecido, ele foi criado com o suporte do PCRE :

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

Com sed:

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

Observe que usar setafassume que o terminal suporta seqüências de escape de cores ANSI; portanto, é possível codificá-lo com firmeza, o que o tornaria menos detalhado também. Aqui com ksh93(também bashe zsh) sintaxe:

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

Para generalizar para a enésima coluna:

n=5

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

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

Referências

Stéphane Chazelas
fonte
grep -Pé fantástico. Muito obrigado.
User1968963
6

Algo assim?

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

Editar: use os tputsubcomandos adequados .

triplo
fonte
A configuração $1interromperá o alinhamento da coluna.
Stéphane Chazelas
2
A rigor, rmsoé para cancelar smso(modo de destaque), não bold. Em muitos terminais ( tput rmsose não cancelar tput bold).
Stéphane Chazelas