这是我用来列出一些文件的命令:
find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \;
-rw-r--r-- 1 qa1wrk15 test 1265190 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_7.20110929.extract.sys
-rw-r--r-- 1 qa1wrk15 test 1345554 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_2.20110929.extract.sys
-rw-r--r-- 1 qa1wrk15 test 1370532 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_3.20110929.extract.sys
-rw-r--r-- 1 qa1wrk15 test 1399854 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_8.20110929.extract.sys
等等。
现在我想通过对第五列求和来计算这些文件的总大小。我想使用awk
, 来执行此操作,因此我在特定目录中测试了以下内容
>ls -lrt | awk `{ print $1 }`
ksh: syntax error at line 1 : `{' unmatched
我不明白问题是什么,为什么会这样语法错误。
我想尝试一下
ls -lrt | awk `BEGIN {total = 0} {for(i=0;i<NR;i++){total+=$5}} END {printf "%d",total}
这也是,但是一个简单的awk
脚本不起作用。
如果我错了,或者是否有解决方法,请提出建议或纠正我。
答案1
首先,应该使用直单引号 ( '
),而不是斜单引号 ( `
)。
内联脚本awk
可以如下所示:
ls -lrt | awk '{ total += $5 }; END { print total }'
因此,无需初始化total
(awk
将其初始化为零),也无需循环,awk
已经在每一行输入上执行脚本。
答案2
@enzotib 已经指出了你的语法错误是什么 - 我要稍微切题了。
对一列数字求和是不断出现的事情之一。我最终得到了这个 shell 函数:
sumcol()
{
awk "{sum+=\$$1} END {print sum}"
}
这样,您的解决方案就变成了:
ls -lrt | sumcol 5
这将对第 5 列中的数字求和并打印该值。
答案3
这是使用以下方法来执行此操作的另一种方法du
:
find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'
答案4
使用 GNU find
:
find -name '*.extract.sys' -size +1000000c -printf '%s\n' | jq -s add
使用 GNU stat
:
find . -name '*.extract.sys' -size +1000000c -exec stat -c%s '{}' + | jq -s add
使用BSD stat
:
find . -name '*.extract.sys' -size +1000000c -exec stat -f%z '{}' + | jq -s add