我喜欢ls -l
通过消除前 4 列来限制命令中显示的列。
ls -lh
显示:
drwxr-sr-x 20 gamma alpha 4.0K May 22 13:18 Desktop
drwxr-sr-x 3 gamma alpha 22 Oct 6 2014 Eclipse
-rw-r--r-- 1 gamma alpha 28K Jul 11 2014 fire
drwxr-sr-x 5 gamma alpha 48 Mar 31 2014 lb_deployment
Run Code Online (Sandbox Code Playgroud)
为了消除前四列,我尝试了ls -lh | cut -d " " -f5-
. 但它的行为不符合预期:
4.0K May 22 13:18 Desktop
alpha 22 Oct 6 2014 Eclipse
alpha 28K Jul 11 2014 fire
alpha 48 Mar 31 2014 lb_deployment
Run Code Online (Sandbox Code Playgroud)
我喜欢它看起来像这样:
4.0K May 22 13:18 Desktop
22 Oct 6 2014 Eclipse
28K Jul 11 2014 fire
48 Mar 31 2014 lb_deployment
Run Code Online (Sandbox Code Playgroud)
其行为不符合预期的原因是,在cut
我将分隔符定义为空格 ( -d " "
),但由于\ls -lh
第一个文件的链接数( 的第二列)是 2 位数字 (20),因此ls -lh
添加了另一个空白到文件的链接计数器,用 1 位链接计数器调整列位置。这会导致cut
行为不符合预期。
有想法该怎么解决这个吗?
传递-o
和-g
选项以省略用户和组列。由于用户名和组名可以包含空格,因此您无法可靠地将它们编辑掉。
没有选项可以省略权限和链接计数列。由于您要保留的第一列可以以空格开头(用于右对齐),因此您不能使用空格到非空格的转换作为开始标准。相反,使用最后一列的右边缘来消除您不想要的列。这是安全的,因为前两列不能包含嵌入的空格。
ls -lhog | sed 's/^[^ ][^ ]* *[^ ][^ ]* //'
Run Code Online (Sandbox Code Playgroud)
sed 命令说明:
s/REGEXP/REPLACEMENT/
用指定的替换文本替换每行第一次出现的指定正则表达式。此处替换文本为空。^
在正则表达式的开头使它只在行的开头匹配。[^ ][^ ]*
匹配除空格以外的任何非空字符序列。