我想自定义输出:
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;}'
选项卡也是文件/文件夹中的有效字符。在我看来,这绝不是一个问题。
答案 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
进行进一步处理,否则这应该足够了。