如何在 ls -l 中仅显示最后 k 列?

如何在 ls -l 中仅显示最后 k 列?

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

相关内容