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

LoM*_*aPh 5 ls shell cut

我喜欢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行为不符合预期。

有想法该怎么解决这个吗?

Gil*_*il' 6

传递-o-g选项以省略用户和组列。由于用户名和组名可以包含空格,因此您无法可靠地将它们编辑掉。

没有选项可以省略权限和链接计数列。由于您要保留的第一列可以以空格开头(用于右对齐),因此您不能使用空格到非空格的转换作为开始标准。相反,使用最后一列的右边缘来消除您不想要的列。这是安全的,因为前两列不能包含嵌入的空格。

ls -lhog | sed 's/^[^ ][^ ]*  *[^ ][^ ]* //'
Run Code Online (Sandbox Code Playgroud)

sed 命令说明:

  • s/REGEXP/REPLACEMENT/用指定的替换文本替换每行第一次出现的指定正则表达式。此处替换文本为空。
  • ^ 在正则表达式的开头使它只在行的开头匹配。
  • [^ ][^ ]* 匹配除空格以外的任何非空字符序列。
  • 因此 sed 命令删除第一个和第二个非空白序列,以及下一个空格(但最后只有一个空格)。