2017-04-09 93 views
1

我有一些像这样的输出ls -alth如何在命令行中使用正则表达式切割?

drwxr-xr-x 5 root admin 170B Aug 3 2016 .. 
drwxr-xr-x 5 root admin 70B Aug 3 2016 .. 
drwxr-xr-x 5 root admin  3B Aug 3 2016 .. 
drwxr-xr-x 5 root admin  9M Aug 3 2016 .. 

现在,我想解析出170B部分,这显然是在人类可读的格式大小。我想用cutsed这样做,因为我不想使用比所需更复杂/难以使用的工具。

理想我希望它有足够能力去处理伴随大小BMK后缀,并通过110000001000据此相应地成倍增加。不过,我还没有找到一个好的方法来做到这一点。

我已经尝试了一些事情没有真正了解的最佳途径:

ls -alth | cut -f 5 -d \s+ 

我希望将工作,因为我可以只限定它一个或多个空格

但这并不奏效。我如何提供一个正则表达式分隔符cut?还是有更简单的方法来从ls -alth只提取文件的大小?

我使用的是CentOS6.4

+0

为什么不'LS -alth结果|切-d”“-f5' ..? –

+0

我其实从来没有听说过这个选择。这是行不通的,因为它需要分割任意数量的空间。你的例子只在一个空间分裂。我在问题中增加了几条示例行,以使其更加清晰。 – guimption

+1

好吧...那么'ls -alth | awk'{print $ 5}''?这在缺省情况下适用于任何空白区域。顺便说一下,即使在我的Debian中进行了剪切工作。 –

回答

2

这个答案铲球如问这个问题,但考虑George Vasiliou's helpful find solution作为一个潜在的优良替代品。

  • cut只支持一个单一,文字字符作为分隔符(-d),所以它是不使用合适的工具。

  • 用于提取与每行的空白可变量的分隔的标记(字段),awk是最好的工具,所以通过George Vasiliou提出的解决方案是最简单的一种:
    ls -alth | awk '{print $5}'
    提取第五whitespace-分隔的字段($5),这是大小。

  • 除了使用-h第一和然后重新转换人类可读后缀(如BM,并G)回仅仅字节计数(另外,乘法器必须是1024倍数,不1000) ,只需从ls命令,默认情况下输出的原始字节计数省略-h
    ls -alt | awk '{print $5}'

+1

@GeorgeVasiliou:这是一个好主意 - 我建议创建自己的答案。 – mklement0

+1

这实际上是从'ls -alth'中省略'-h'标志的好方法。我没有想到这一点。 – guimption

2

替代AWK溶液THA t会正确处理空白,也可以使用find实用程序,它可以提供类似于ls的结果。

实际上,您可以使用find直接显示结果的大小,而无需使用任何其他工具/管道,如cutawk

所以,要列出只是个字节你可以使用:

$ find . -maxdepth 1 -printf %s\\n 
173 
3 
684 

您可以找到

$ find . -maxdepth 1 -printf %f-%s\\n 
bsd.txt-173 
file4-3 
shellcolors.sh-684 

组合文件名+字节你可以咨询man find看到很多可供选择的-printf下。

此外,通过删除-maxdepth选项,您还可以列出子目录中的所有文件。

还有一个替代方案是使用du效用,其能够提供在人类可读的格式的结果:

$ du -a -b -h -d1 
1.9M ./appsfiles 
173 ./bsd.txt 
3 ./file4 
684 ./shellcolors.sh 

-a:所有文件和目录。删除此选项以获取仅目录大小
-b报告文件的实际大小 - 删除此选项将报告此文件占用的磁盘大小(即3 kB的文件实际占用4K)
-h:人类可读大小
-d1:depth1

您可以进一步解析的杜与|cut -d" " -f1|awk '{print $1}'