bash:对输出的第二列进行着色

bash:对输出的第二列进行着色

假设我有以下来自 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*
...

我正在寻找一种方法,如何为第二列着色。我知道如何使用 sed 为任何模式着色,但我不知道如何为特定列着色。基本上,我需要'\033[0;31m'在第一个空格之后和'\033[0m'第二个空格之前插入。或者也许还有更优雅的方式?

答案1

使用 GNUgrep提供的它是用聚合酶链式反应支持:

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(alsobashzsh) 语法:

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子命令。

相关内容