如何使用regexp分隔符获取第n列

时间:2012-12-10 16:20:11

标签: bash unix text text-processing

基本上我从ls -la命令获取行:

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

并希望获得文件大小(442)。我已经尝试了cutsed命令,但是没有成功。使用基本的UNIX工具(cut,sed,awk ...),如何从stdin获取特定列,其中分隔符为/ +/ regexp?

3 个答案:

答案 0 :(得分:14)

如果您想使用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 '[^ ]+$'

答案 1 :(得分:5)

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

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

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

另见Why You Shouldn't Parse the Output of ls(1)

答案 2 :(得分:2)

使用以下方法管道输出:

awk '{print $5}'

或者甚至更好地使用这样的stat命令(在Mac上):

stat -f "%z" yourFile

或(在Linux上)

stat -c "%s" yourFile

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