格式化du -sh输出

时间:2015-07-30 20:54:35

标签: bash awk du

我想自定义输出:

du -hs *

E.g输出:

23G    Test1
1.2M   Folder With Spaces
12G    Another Folder With Spaces

问题是我可以捕获第一列,但由于第二列可能包含空格,因此输出仅捕获第一个单词。有没有办法捕获包含的第二列空格,或者可能返回该行的剩余内容?

du -hs * | awk '{print $1 " " $2;}'

以上回复:

23G Test1
1.2M Folder
12G Another

编辑:解决方案是添加-F并指定制表符分隔符:

du -hs * | awk -F'\t' '{print $1 " " $2;}'

选项卡也是文件/文件夹中的有效字符。在我看来,这绝不是一个问题。

2 个答案:

答案 0 :(得分:3)

对于我的du(GNU coreutils),大小和文件名由制表符分隔。因此,可以通过删除包括第一个选项卡在内的所有内容来检索名称:

du -hs * | awk '{size=$1; name=$0; sub(/[^\t]*\t/, "", name); print name}'

注意:如果文件名包含换行符,则上述操作将失败。根据您使用的操作系统,可能存在解决此限制的方法。例如,在linux(GNU工具)上,du可以生成NUL分隔的记录,GNU awk(gawk)可以读取和解释这些记录:

du -0hs * | awk -v RS='\0'  '{size=$1; name=$0; sub(/[^\t]*\t/, "", name); print "NAME="name}'

答案 1 :(得分:2)

由于du使用制表符,而您的文件名不应包含制表符或新行,您只需使用cut(默认分隔符为制表符)。

du -hs * | cut -f1  # First field
du -hs * | cut -f2  # Second field
du -hs * | cut -f2-  # All fields >= 2 (if there are tabs in the filename)

除非您需要awk进行进一步处理,否则这应该足够了。

相关问题