我从'ls -l‘获取输出,并通过awk将其重新格式化。这样做是可行的:
list=$(ls --color=none -l | tail -n+2)
printf '%s' "$list" | awk '{printf "%-40s more stuff\n", $9}'
它产生的结果如下:
env_profiles more stuff
ls_test.sh more stuff
saddfasfasfdfsafasdf more stuff
test more stuff
但是
env_profiles more stuff
ls_test.sh more stuff
saddfasfasfdfsafasdf more stuff
test more stuff
more stuff
"env_profiles“是一个目录,"ls_test.sh”是一个可执行文件,因此它们都是彩色的,并以不同的对齐方式结束。还有一条额外的线路。
编辑:修改后的答案,根据埃德莫顿的帖子。去掉额外的行,处理带有空格的文件名:
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
}
}'
发布于 2014-05-04 16:30:11
包含有色文件名的字段($9)以控制字符开头和结尾,以在终端上生成颜色,例如,在本例中,foo
在屏幕上着色,但bar
没有:
$ 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
结尾,所以尝试如下:
$ awk '{
nameOnly = $NF
gsub(/\x1b[^m]+m/,"",nameOnly)
printf "<%-*s>\n", 10 + length($NF) - length(nameOnly), $NF
}' o1
<foo >
<bar >
请注意,只有当文件名中没有空格时,才能使用特定字段的方法
发布于 2014-05-04 16:29:51
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
代替填充。
https://stackoverflow.com/questions/23458318
复制相似问题