8

基本上我从ls -la命令中得到一行:

-rw-r--r--  13 ondrejodchazel  staff  442 Dec 10 16:23 some_file

并想要获取文件的大小(442)。我已经尝试过cut命令sed,但没有成功。仅使用基本的 UNIX 工具(cut、sed、awk ...),我如何从标准输入中获取特定列,其中分隔符是正则/ +/表达式?

4

3 回答 3

17

如果你想这样做,cut你需要先挤压空间 ( tr -s ' ') 因为cut不支持+. 这应该有效:

ls -la | tr -s ' ' | cut -d' ' -f 5

sed使用(GNU sed)时需要做更多的工作:

ls -la | sed -r 's/([^ ]+ +){4}([^ ]+).*/\2/'

如果您使用 grep 替代品(GNU grep),则需要更多的手指打孔:

ls -la | grep -Eo '[^ ]+( +[^ ]+){4}' | grep -Eo '[^ ]+$'
于 2012-12-10T16:56:24.003 回答
5

解析ls输出比你想象的要难。改用专用工具,例如stat

size=$(stat -c '%s' some_file)

ls -la some_file | awk '{print $5}'如果数字使用空格作为千​​位分隔符(这在某些欧洲语言环境中很常见),则可能会中断一种方法。

另请参阅为什么不应该解析ls (1)的输出。

于 2012-12-10T16:22:26.980 回答
2

管道输出:

awk '{print $5}'

甚至更好的是我们使用这样的 stat 命令(在 Mac 上):

stat -f "%z" yourFile

或者(在 Linux 上)

stat -c "%s" yourFile

这将以字节为单位输出文件大小。

于 2012-12-10T16:23:03.423 回答