bash:出力の2番目の列のカラー化

bash:出力の2番目の列のカラー化

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*
...

2番目の列に色を付ける方法を探しています。 sedを使用してパターンに色を割り当てる方法を知っていますが、特定の列に色を割り当てる方法がわかりません。デフォルトでは、'\033[0;31m'最初のスペースの後、'\033[0m'2番目のスペースの前に挿入する必要があります。それとも、もう少しエレガントな方法がありますか?

答え1

GNUが提供するものを使用してgrep使用されます。ポリメラーゼ連鎖反応サポートする:

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ターミナルが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"

引用する

答え2

このような?

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

編集:正しいtputサブコマンドを使用してください。

関連情報