我有这个功能.bashrc
:
{ ls -lhNGhgF --color=always --group-directories-first --time-style="+%d-%b-%Y $newline%H:%M" | awk '
{
$3 ="\033[1;31m" $3 "\033[0m";
$4 ="\033[1;48;5;196m" $4 "\033[0m";
$5 ="\033[1;30m" $5 "\033[0m";
print;
}
'
}
它有效,但输出的列未对齐。我该如何解决?
前言
在这种情况下,解析 的输出
ls
是合理的。用于程序获取数据是错误的ls
。在这里,您想要获取人类可读的输出并使其对人类更具可读性。这远没有那么重要;如果出现问题,您可能会立即注意到。的实现
ls
可能会生成略有不同的输出,即使它们支持您需要的所有选项。出于这个原因,任何解决此类问题的方法都必须适合自己的需求ls
。作为记录:我的测试台是 Kubuntu 18.04.2 LTS。
代码
使用此功能:
解释:
首先,我将需要的字符串存储为局部变量。我使用
$''
的语法适用于 Bash,除了c5
(出于教育原因)从printf
. 重点是printf
即使在.sh
$''
然后我使用
sed
扩展的正则表达式来搜索和替换。除最后一列外的任何列都可以匹配,[^ ]+ +
这意味着“至少一个非空格和至少一个空格”。在替换中,与第一组括号 ((…)
) 匹配的任何内容都称为\1
; 到第 2 组 – 如\2
; 等等。这样我就可以匹配前五列并使用\1\2\3\4\5
. 这个唯一的操作是空操作,直到我在正确的位置注入以前存储的字符串:笔记:
您可能已经注意到第 4 列和第 5 列匹配的是
([^ ]+)( +[^ ]+ +)
而不是通用([^ ]+ +)
重复两次。如果是,([^ ]+ +)([^ ]+ +)
则这些列之间的空格字符在逻辑上属于第 4 列,因此由于您为第 4 列选择的背景颜色,它们将被打印成红色。将它们包含在第 5 列中可以解决问题。我在第 1 列和第 2 列之间不插入任何内容,因此我可以将它们都与一组括号(即
([^ ]+ +[^ ]+ +)
)匹配,替换字符串将如下所示:\1$c3\2$c0$c4\3$c0$c5\4$c0
。然后\1
将引用两列,\4
将引用第 5 列。我决定避免混淆并使这些数字与列的自然编号保持一致。command ls
确保该函数不会运行名为 的函数ls
,即使已定义一个函数也是如此。这在这里太过分了,但是如果您决定重命名lsi
为ls
thencommand
将帮助您避免不必要的无限递归。我
"$@"
在调用结束时添加了,ls
所以我可以做lsi /
,lsi /dev/sd*
等等。请注意,这也允许我指定可能运行良好(例如lsi -a
)或不太好的其他选项(它们可能会在不移动颜色的情况下移动列,例如lsi -i
) .我压缩了选项。有
-g
你不需要-l
;而你有-h
两次;我认为在管道中-N
使用时无关紧要。ls
您仍然ls
可能会有所不同,过多的选择只会损害优雅。使用适合您的任何东西。