基本上我从ls -la
命令中得到一行:
-rw-r--r-- 13 ondrejodchazel staff 442 Dec 10 16:23 some_file
并想要获取文件的大小(442)。我已经尝试过cut
命令sed
,但没有成功。仅使用基本的 UNIX 工具(cut、sed、awk ...),我如何从标准输入中获取特定列,其中分隔符是正则/ +/
表达式?
基本上我从ls -la
命令中得到一行:
-rw-r--r-- 13 ondrejodchazel staff 442 Dec 10 16:23 some_file
并想要获取文件的大小(442)。我已经尝试过cut
命令sed
,但没有成功。仅使用基本的 UNIX 工具(cut、sed、awk ...),我如何从标准输入中获取特定列,其中分隔符是正则/ +/
表达式?
如果你想这样做,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 '[^ ]+$'
解析ls
输出比你想象的要难。改用专用工具,例如stat
。
size=$(stat -c '%s' some_file)
ls -la some_file | awk '{print $5}'
如果数字使用空格作为千位分隔符(这在某些欧洲语言环境中很常见),则可能会中断一种方法。
另请参阅为什么不应该解析ls (1)的输出。
管道输出:
awk '{print $5}'
甚至更好的是我们使用这样的 stat 命令(在 Mac 上):
stat -f "%z" yourFile
或者(在 Linux 上)
stat -c "%s" yourFile
这将以字节为单位输出文件大小。