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
为了消除前四列,我尝试了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
我喜欢它看起来像这样:
4.0K May 22 13:18 Desktop
22 Oct 6 2014 Eclipse
28K Jul 11 2014 fire
48 Mar 31 2014 lb_deployment
其行为不符合预期的原因是,在cut
我将分隔符定义为空格 ( -d " "
) 中,但由于第一个文件的链接数( 的第二列\ls -lh
)是 2 位数字 (20),因此ls -lh
添加了另一个使用 1 位链接计数器将空格添加到文件的链接计数器以调整列位置。这会导致cut
行为不符合预期。
有想法该怎么解决这个吗?
答案1
传递-o
和-g
选项以省略用户和组列。由于用户名和组名可能包含空格,因此您无法可靠地将其编辑掉。
没有选项可以省略权限和链接计数列。由于您要保留的第一列可以以空格开头(用于右对齐),因此您不能使用空格到非空格的转换作为开始标准。相反,请使用最后一列的右边缘来消除不需要的列。这是安全的,因为前两列不能包含嵌入的空格。
ls -lhog | sed 's/^[^ ][^ ]* *[^ ][^ ]* //'
sed命令解释:
s/REGEXP/REPLACEMENT/
用指定的替换文本替换每行中第一次出现的指定正则表达式。这里的替换文本是空的。^
在正则表达式的开头使其仅在行的开头匹配。[^ ][^ ]*
匹配除空格之外的任何非空字符序列。- 因此 sed 命令删除第一个和第二个非空白序列,以及下一个空格(但最后只有一个空格)。
答案2
这对我有用:
ls -lhn | sed -r 's#^\S+(\s+\S+){3}##'
将用户名和组名转换为数字 ID 的额外-n
标志。ls
结果我们得到了已知数量的要剥离的字段:
-rwxr-xr-x 1 1001 1001 1.4K Mar 23 18:07 something.sh
每列之间的空白是可变的,但用于ls
对齐列,因此我们不能盲目地将其删除。我选择剥夺前导块的权限,然后是三组空白文本然后非空白文本,分别匹配链接计数、uid 和 gid。这使得分隔 gid 和文件大小的空白保持不变,以便对齐可以继续工作。正则表达式sed
就是实现这种模式删除的。#...#...#
提供分隔符 (匹配和代替),并且该-r
标志允许我们使用扩展正则表达式。剖析我们有^
匹配的行首;匹配\S+
一个或多个非空白字符并\s+
匹配一个或多个空白字符;括号(...)
将这两个项目组合在一起,并且大括号{3}
表明该组必须重复 3 次。
4.0K Jun 6 2014 template
4.0K May 21 17:35 stuff
0 Mar 16 09:46 Items
1.4K Mar 23 18:07 something.sh
24K May 19 14:45 curtain
答案3
加入合唱团后,您还可以用它awk
来清空您不想要的列:
[jis@localhost ~]$ ls -lh | awk '{$1=$2=$3=$4="";print}'
4.0K Aug 19 2014 Desktop
4.0K Jan 8 22:39 dir1
4.0K Feb 5 20:41 Documents
12K May 22 19:31 Downloads
4.0K Aug 19 2014 Music
4.0K May 3 20:00 Pictures
4.0K Aug 19 2014 Public
115K May 9 09:05 something.bin
4.0K Aug 19 2014 Templates
1 Dec 12 07:01 testLink -> .
4.0K Aug 19 2014 Videos
[jis@localhost ~]$
答案4
使用 grep 的一个巧妙的解决方案:
ls -lhn | grep -oP "^([[:graph:]]+\s){4}\K.+"
这里,
[[:graph:]] ==> all printed characters (i.e. no spaces, newlines)
\s ==> space
{4} ==> exactly four matches