如何为 ls 的输出列着色?

如何为 ls 的输出列着色?

标题说明了一切:我希望获得类似以下输出的整齐彩色列ls -al,例如10basetom 的回答这个问题

链接答案中语法突出显示的代码片段的屏幕截图

答案1

这可以通过 来实现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,它就会给您所需的输出:

彩色输出的屏幕截图

答案2

这将以红色打印第二列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 代码定义了变量blackred和 ,blue它们分别包含黑色、红色和蓝色的终端代码。这些代码放在我们要着色的任何列的开头。

一个技巧是颜色代码不会自行重置。因此,除非指定了另一个颜色命令,否则您在一行上指定的最后一种颜色将成为下一行的默认颜色。

相关内容