bash: colorear la segunda columna de salida

8

digamos, tengo el siguiente resultado 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*
...

Estoy buscando una manera, cómo podría colorear la segunda columna. Sé cómo usar sed para colorear cualquier patrón, pero no sé cómo colorear una columna específica. Básicamente, necesito insertar '\033[0;31m'después del primer espacio y '\033[0m'enfrente del segundo espacio. O tal vez hay una manera mucho más elegante?

usuario1968963
fuente
1
feo:ls --color -l | sed -e $'s/ *[^ ]* /\033[0;31m&\033[0m/'
frostschutz

Respuestas:

10

Con GNU grepsiempre que haya sido construido con soporte PCRE :

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

Con sed:

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

Tenga en cuenta que el uso setafasume que el terminal admite secuencias de escape de color ANSI, por lo que también podría codificarlo, lo que también lo haría menos detallado. Aquí con ksh93(también bashy zsh) sintaxis:

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

Para generalizar a la enésima columna:

n=5

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

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

Referencias

Stéphane Chazelas
fuente
grep -Pes fantastico. Muchas gracias.
user1968963
6

¿Algo como esto?

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

Editar: use los tputsubcomandos adecuados .

tripleee
fuente
$1Sin embargo, la configuración romperá la alineación de la columna.
Stéphane Chazelas
2
Estrictamente hablando, rmsoes cancelar smsosin embargo (modo destacado), no bold. En muchos terminales ( tput rmsono se cancela tput bold).
Stéphane Chazelas