Answers:
这是可行的awk
。不幸的是,由于ls -l
未指定的格式,因此不可能提出适用于每个系统的解决方案,因此在某些系统上需要对用于哪一列的颜色进行一些调整。
首先,我们要保留所使用的原始空间ls -l
。否则,列对齐将不正确。我们可以使用该FPAT
选项来完成此任务,这要归功于这样的答案:
ls -la | awk '
BEGIN {
FPAT = "([[:space:]]*[^[:space:]]+)";
OFS = "";
}
在中awk
,每个位置参数($1
,$2
等)都指向一个字段,即当前行上的一列。FPAT
上面的选项所做的是将每个字段重新定义为包括所有前面的空格,因此当您将print
其退回时,它会保留空格,以使列保持在同一位置。
现在我们可以简单地编辑每个字段以插入颜色代码,然后打印编辑后的输出:
{
$2 = "\033[31m" $2 "\033[0m";
$3 = "\033[36m" $3 "\033[0m";
$4 = "\033[36m" $4 "\033[0m";
$5 = "\033[31m" $5 "\033[0m";
$6 = "\033[36m" $6 "\033[0m";
$7 = "\033[36m" $7 "\033[0m";
$8 = "\033[31m" $8 "\033[0m";
print
}
'
请注意,各列被复位回为默认值(在0
之间的[
和m
)之后。如果您希望颜色跨多列显示,则可以省略该代码。就个人而言,我更愿意独立指定每个列。
您可以在中定义一个可重用的命令.bashrc
。例如:
lsc() {
ls -la | awk '
BEGIN {
FPAT = "([[:space:]]*[^[:space:]]+)";
OFS = "";
}
{
$2 = "\033[31m" $2 "\033[0m";
$3 = "\033[36m" $3 "\033[0m";
$4 = "\033[36m" $4 "\033[0m";
$5 = "\033[31m" $5 "\033[0m";
$6 = "\033[36m" $6 "\033[0m";
$7 = "\033[36m" $7 "\033[0m";
$8 = "\033[31m" $8 "\033[0m";
print
}
'
}
您可能需要重新启动bash
会话(或运行source ~/.bashrc
),此函数定义才能运行。
从这里,您可以调用lsc
,这将为您提供所需的输出:
--color=always
。只要您不对文件名列应用其他颜色($9
在我的示例中),就awk
应将它们传递通过。
这将以ls -alF
红色打印第二列,以蓝色打印第三至第八列,以黑色打印第九列:
ls -alF | awk -v black=$(tput setaf 0) -v red=$(tput setaf 1) -v blue=$(tput setaf 4) '{$2=red $2; $3= blue $3; $9=black $9} 1'
这仅是示例。您可以根据自己的喜好自定义内容。
对于那些喜欢将代码分散到多行的用户:
ls -alF | awk -v black=$(tput setaf 0) \
-v red=$(tput setaf 1) \
-v blue=$(tput setaf 4) \
'{
$2=red $2
$3= blue $3
$9=black $9
}
1'
tput
是一个实用程序,可为您的终端生成各种控制代码。例如, tput setaf n
将前景颜色到n
其中n
的范围可以从0到7
0 – Black
1 – Red
2 – Green
3 – Yellow
4 – Blue
5 – Magenta
6 – Cyan
7 – White
您可以在此处阅读有关tput
其颜色功能的更多信息。
awk代码定义变量black
,,red
并且分别blue
包含黑色,红色和蓝色的终端代码。这些代码位于我们要着色的任何列的开头。
一种技巧是颜色代码不会自行重置。因此,无论您在一行上指定的最后一种颜色,除非指定了另一种颜色命令,否则它将是下一行的默认颜色。
awk
!我建议您也包括保留列对齐的模式:)
FPAT
保持正确间距的技巧。