Bash: Koloriere die zweite Spalte der Ausgabe

8

Nehmen wir an, ich habe folgende Ausgabe von 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*
...

Ich suche nach einem Weg, wie ich die zweite Spalte einfärben könnte. Ich weiß, wie man sed verwendet, um ein Muster einzufärben, aber ich weiß nicht, wie man eine bestimmte Spalte einfärbt. Grundsätzlich muss ich '\033[0;31m'nach dem ersten Leerzeichen und '\033[0m'vor dem zweiten Leerzeichen einfügen . Oder gibt es vielleicht einen viel eleganteren Weg?

user1968963
quelle
1
hässlich:ls --color -l | sed -e $'s/ *[^ ]* /\033[0;31m&\033[0m/'
Frostschutz

Antworten:

10

Mit GNU wurde grepes mit PCRE- Unterstützung erstellt:

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

Mit sed:

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

Beachten Sie, dass bei Verwendung setafdavon ausgegangen wird, dass das Terminal ANSI-Farb-Escape-Sequenzen unterstützt. Sie können es also genauso gut hart codieren, wodurch es auch weniger ausführlich wird. Hier mit ksh93(auch bashund zsh) Syntax:

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

Um auf die n- te Spalte zu verallgemeinern :

n=5

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

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

Verweise

Stéphane Chazelas
quelle
grep -Pist fantastisch. Vielen Dank.
user1968963
6

Etwas wie das?

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

Bearbeiten: Verwenden Sie die richtigen tputUnterbefehle.

Tripleee
quelle
Durch die Einstellung $1wird jedoch die Spaltenausrichtung unterbrochen.
Stéphane Chazelas
2
Streng genommen rmsoist es jedoch abzubrechen smso(herausragender Modus), nicht bold. Auf vielen Terminals ( tput rmsonicht nicht abbrechen tput bold).
Stéphane Chazelas