如何从du -h输出的末尾删除文件名

15

以这个例子为例:

$ du -h file_size.txt
112K file_size.txt

如何从du -h输出中删除文件名?

我尝试使用sed搜索字符串(文件名)并将其替换为“nothing”,但它没有起作用(命令如下)。

du -h file_size.txt | sed 's/ 'file_size.txt'//'

请问有人能指出为什么这个方法不起作用,或者提供更好的实现方式吗?

谢谢

Paul

9个回答

21

你在那个命令行中引号用得不正确。最简单的方法可能是:

du -h file_size.txt | cut -f -1

要修复你的命令行:

du -h file_size.txt | sed 's/file_size.txt//'

鉴于您的帖子标有awk标签:

du -h file_size.txt | awk '{ print $1 }'

2
或者 du -h file_size.txt | sed 's/\s+.*//' - Tomalak
@Tomalak 的想法很正确,使用 sed - 肯定比两次输入文件名要好。 - Carl Norum
糟糕,单引号是我之前留下的$VARIABLE。感谢一如既往的帮助。 - paultop6
1
@paultop6:如果你使用一个变量,而不是打开、关闭、重新打开和关闭单引号,只需像这样使用双引号:sed "s/${VARIABLE}//" - Dennis Williamson
@Dennis:如果变量包含正则表达式元字符,这段代码仍然能正确工作吗? - Tomalak
顺便提一下,cut 命令可选地接受一个分隔符 (-d),默认为制表符 (\t)。而 du 命令则使用制表符来分隔列。 - Berkant İpek

14
du -h file_size.txt | cut -f1

5

输出第一列很简单。这里是awk的解决方案。

du -h test.txt  | awk '{ print $1 }'

0

处理包含换行符的文件名:

$ du -h $'./filename\nwith\nnewlines.txt' | awk 'NR==1 { print $1 }'
4.0K

这里有一个非常酷的sed解决方案,使用“打印并退出”的技巧,从这里获取:

$ du -h $'./filename\nwith\nnewlines.txt' | sed -E -n '/(.*)\t.*/{s//\1/p;q;}'
4.0K

这里的大多数其他答案都无法处理换行符(除了ghostdog的set答案):

$ du -h $'./filename\nwith\nnewlines.txt' | cut -f1
4.0K
with
newlines.txt

0
为什么不直接使用stat呢?
 stat -f '%z' vg1.mp4   # BSD-stat
821258414
gstat -c '%s' vg1.mp4   # GNU-stat
821258414

如果你坚持使用 du 的方式,获取第一列比上述方法更加简洁:

du -smh vg1.mp4 | awk NF=1 
783M

或者使用<重定向将文件发送到管道中,这样您就不需要修剪文件名——某种程度上,BSD-wc会填充一个额外的空格。
gwc -c < vg1.mp4    # GNU-wc      
821258414
 wc -c < vg1.mp4    # BSD-wc
 821258414

0

du -h 的输出是以 [tab] 为分隔符的。

du -h file_size.txt |sed 's/[\t].*//g'

0

如果你的数据有不同的字段,例如空格/制表符,那么使用像awk/cut这样的工具通过分隔符来拆分它们会更容易。使用正则表达式(例如sed)是不必要的。更好的方法是只使用shell。

各种方式

$ du -h file | awk '{print $1}'
4.0K

$ du -h file | cut -f1
4.0K

$ set -- $(du -h file) #using shell only
$ echo $1
4.0K

0

这个方法可能有点啰嗦,但无论如何,这是另一种实现你想要的功能的方式:

du -h file_size.txt |while read x junk; do echo $x; done

0

你原来的命令本来可以工作,但是你在sed正则表达式中包含了一个空格,并且du输出制表符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接