首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用awk生成有颜色输入的固定宽度列?

如何使用awk生成有颜色输入的固定宽度列?
EN

Stack Overflow用户
提问于 2014-05-04 15:56:17
回答 2查看 1.8K关注 0票数 1

我从'ls -l‘获取输出,并通过awk将其重新格式化。这样做是可行的:

代码语言:javascript
运行
复制
list=$(ls --color=none -l | tail -n+2)
printf '%s' "$list" | awk '{printf "%-40s more stuff\n", $9}'

它产生的结果如下:

代码语言:javascript
运行
复制
env_profiles                             more stuff
ls_test.sh                               more stuff
saddfasfasfdfsafasdf                     more stuff
test                                     more stuff

但是

代码语言:javascript
运行
复制
env_profiles                 more stuff
ls_test.sh                   more stuff
saddfasfasfdfsafasdf             more stuff
test                             more stuff
                                         more stuff

"env_profiles“是一个目录,"ls_test.sh”是一个可执行文件,因此它们都是彩色的,并以不同的对齐方式结束。还有一条额外的线路。

编辑:修改后的答案,根据埃德莫顿的帖子。去掉额外的行,处理带有空格的文件名:

代码语言:javascript
运行
复制
ls --color=always -l | tail -n+2 | awk '
{
    $1=$2=$3=$4=$5=$6=$7=$8=""
    field = substr($0,9)
    nameOnly = $0
    gsub(/\x1b[^m]+m/,"",nameOnly)
    if( length(field) - length(nameOnly) >= 0 ) {
        printf "%-*s more stuff\n", 40 + length(field) - length(nameOnly), field
    }
}'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-04 16:30:11

包含有色文件名的字段($9)以控制字符开头和结尾,以在终端上生成颜色,例如,在本例中,foo在屏幕上着色,但bar没有:

代码语言:javascript
运行
复制
$ cat o1
-rwxr-xr-x  1 emorton Domain Users     21591 Nov 12  2011 foo
-rwxr-xr-x  1 emorton Domain Users     21591 Nov 12  2011 bar

$ cat -v o1
-rwxr-xr-x  1 emorton Domain Users     21591 Nov 12  2011 ^[[01;32mfoo^[[0m
-rwxr-xr-x  1 emorton Domain Users     21591 Nov 12  2011 bar

所以当你在awk中打印该字段并给它N个字符的字段宽度时,产生颜色的字符串被计算为宽度的一部分,但是如果它们是非打印的或后置空间,那么最终的结果将不会显示它们,而且看起来它使用的空间更少--一个不包含这些字符的字段。希望这是合理的。

在我看来,着色字符串总是以字符\x1b开头,然后是一些着色指令,以m结尾,所以尝试如下:

代码语言:javascript
运行
复制
$ awk '{
    nameOnly = $NF
    gsub(/\x1b[^m]+m/,"",nameOnly)
    printf "<%-*s>\n", 10 + length($NF) - length(nameOnly), $NF
}' o1
<foo       >
<bar       >

请注意,只有当文件名中没有空格时,才能使用特定字段的方法

票数 0
EN

Stack Overflow用户

发布于 2014-05-04 16:29:51

代码语言:javascript
运行
复制
ls --color=always -l | tail -n+2 | awk '{count = gsub(/\x1b/, "\x1b"); if (count == 0) count += 40; else count += 50; printf "%-"count"s more stuff\n", $9}'

解释

gsub返回行上的替换数。在这种情况下,我们将转义字符\x1b替换为自身,存储它出现的次数。

如果没有发现转义序列(count == 0),我们增加了40个填充空间。

如果线路上有转义序列(即。(颜色),我们添加了40个填充空间,再加上另外10个空格。当然,count已经等于转义的数量。

我发现,在我的系统中,如果一条线有颜色,它需要10个空格的填充,加上转义字符的数目来匹配未着色的线条。例如:普通填充= 40;线上有3个转义序列;填充应该是40 + 10 +3= 53。这在您的系统中可能是不同的,可能需要调整数字。

最后,我们打印这一行,用count代替填充。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23458318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档