bash: colorise la deuxième colonne de sortie

8

disons, j'ai la sortie suivante 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*
...

Je cherche un moyen, comment je pourrais coloriser la deuxième colonne. Je sais comment utiliser sed pour coloriser n'importe quel motif, mais je ne sais pas comment coloriser une colonne spécifique. Fondamentalement, je dois insérer '\033[0;31m'après le premier espace et '\033[0m'devant le deuxième espace. Ou peut-être existe-t-il une manière beaucoup plus élégante?

user1968963
la source
1
moche:ls --color -l | sed -e $'s/ *[^ ]* /\033[0;31m&\033[0m/'
frostschutz

Réponses:

10

Avec GNU grepfourni, il a été construit avec le support PCRE :

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

Avec sed:

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

Notez que l'utilisation setafsuppose que le terminal prend en charge les séquences d'échappement de couleurs ANSI, vous pouvez donc aussi le coder en dur, ce qui le rendrait également moins verbeux. Ici avec ksh93(aussi bashet zsh) la syntaxe:

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

Pour généraliser à la n ième colonne:

n=5

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

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

Références

Stéphane Chazelas
la source
grep -Pest fantastique. Merci beaucoup.
user1968963
6

Quelque chose comme ça?

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

Modifier: utilisez les tputsous-commandes appropriées .

tripleee
la source
Le réglage $1rompra cependant l'alignement de la colonne.
Stéphane Chazelas
2
À strictement parler, rmsoc'est d'annuler smso(mode stand-out), non bold. Sur de nombreux terminaux ( tput rmsone pas annuler tput bold).
Stéphane Chazelas