假设我有以下来自 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
(alsobash
和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
子命令。