bash:为输出的第二列着色

use*_*963 9 colors text-processing

比方说,我有以下来自 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*
...
Run Code Online (Sandbox Code Playgroud)

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

Sté*_*las 10

使用 GNUgrep提供它已经构建了PCRE支持:

ls -l | GREP_COLORS='mt=1;41;37' grep --color -P '^\S+\s+\K\S+'
Run Code Online (Sandbox Code Playgroud)

sed

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

请注意, usingsetaf假设终端支持 ANSI 颜色转义序列,因此您最好对其进行硬编码,这也会使其不那么冗长。这里使用ksh93(也bashzsh)语法:

on=$'\e[1;47;37m' off=$'\e[m'
Run Code Online (Sandbox Code Playgroud)

推广到第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"
Run Code Online (Sandbox Code Playgroud)

参考


tri*_*eee 6

像这样的东西?

awk -v on="$(tput bold)" -v off="$(tput rmso)" '{ $2=on $2 off }; 1'
Run Code Online (Sandbox Code Playgroud)

编辑:使用正确的tput子命令。

  • 严格来说,`rmso` 是取消`smso`(stand-out 模式),而不是`bold`。在许多终端上(`tput rmso` **不**取消`tput bold`)。 (2认同)