以这个例子为例:
$ du -h file_size.txt
112K file_size.txt
如何从du -h输出中删除文件名?
我尝试使用sed搜索字符串(文件名)并将其替换为“nothing”,但它没有起作用(命令如下)。
du -h file_size.txt | sed 's/ 'file_size.txt'//'
请问有人能指出为什么这个方法不起作用,或者提供更好的实现方式吗?
谢谢
Paul
你在那个命令行中引号用得不正确。最简单的方法可能是:
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 }'
du -h file_size.txt | cut -f1
输出第一列很简单。这里是awk的解决方案。
du -h test.txt | awk '{ print $1 }'
处理包含换行符的文件名:
$ 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
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
du -h
的输出是以 [tab] 为分隔符的。
du -h file_size.txt |sed 's/[\t].*//g'
如果你的数据有不同的字段,例如空格/制表符,那么使用像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
这个方法可能有点啰嗦,但无论如何,这是另一种实现你想要的功能的方式:
du -h file_size.txt |while read x junk; do echo $x; done
你原来的命令本来可以工作,但是你在sed正则表达式中包含了一个空格,并且du输出制表符。
du -h file_size.txt | sed 's/\s+.*//'
- Tomalaksed
- 肯定比两次输入文件名要好。 - Carl Norumsed "s/${VARIABLE}//"
。 - Dennis Williamsoncut
命令可选地接受一个分隔符 (-d
),默认为制表符 (\t
)。而du
命令则使用制表符来分隔列。 - Berkant İpek