mun*_*ish 21 ksh hp-ux shell-script
这是我用来列出一些文件的命令:
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
Run Code Online (Sandbox Code Playgroud)
等等。
现在我想通过总结第 5 列来计算这些文件的总大小。我想使用awk, 来做到这一点,所以我在特定目录中测试了以下内容
>ls -lrt | awk `{ print $1 }`
ksh: syntax error at line 1 : `{' unmatched
Run Code Online (Sandbox Code Playgroud)
我不明白有什么问题,为什么这个语法错误。
我想试试
ls -lrt | awk `BEGIN {total = 0} {for(i=0;i<NR;i++){total+=$5}} END {printf "%d",total}
Run Code Online (Sandbox Code Playgroud)
这也是,但一个简单的awk脚本不起作用。
如果我错了,或者有解决方法,请提出建议或纠正我。
enz*_*tib 28
首先,您应该使用直单引号 ( '),而不是斜引号( `)。
该awk内嵌脚本可能如下:
ls -lrt | awk '{ total += $5 }; END { print total }'
Run Code Online (Sandbox Code Playgroud)
因此,无需初始化total(awk将其初始化为零),也无需循环,awk已经在每一行输入上执行脚本。
cam*_*amh 16
@enzotib 已经指出您的语法错误是什么 - 我将有点切线。
对一列数字求和是不断出现的事情之一。我最终得到了这个 shell 函数:
sumcol()
{
awk "{sum+=\$$1} END {print sum}"
}
Run Code Online (Sandbox Code Playgroud)
有了这个,您的解决方案就变成了:
ls -lrt | sumcol 5
Run Code Online (Sandbox Code Playgroud)
这将对第 5 列中的数字求和并打印该值。
tux*_*xce 14
这是使用以下方法执行此操作的另一种方法du:
find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'
Run Code Online (Sandbox Code Playgroud)
如果 HP-UXfind也有-printfbc选项,那么编写一个公式来计算将很有用:
( find . -name \*.extract.sys -size +1000000c -printf '%s+'; echo 0 ) | bc
Run Code Online (Sandbox Code Playgroud)
如果公式太大,可以逐步计算:
( find . -name \*.extract.sys -size +1000000c -printf 's+=%s\n'; echo s ) | bc
Run Code Online (Sandbox Code Playgroud)