示例输入:(表格格式的制表符分隔值)
Vserver Volume Aggregate State Type Size Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
vs1 vol1 aggr1 online RW 2GB 1.9GB 5%
vs1 vol1_dr aggr0_dp online DP 200GB 160.0GB 20%
vs1 vol2 aggr0 online RW 150GB 110.3GB 26%
vs1 vol2_dr aggr0_dp online DP 150GB 110.3GB 26%
vs1 vol3 aggr1 online RW 150GB 120.0GB 20%
我的任务是在聚合下找到已超过阈值的卷,以便将它们移动到不同的聚合。 需要您的帮助,逐行阅读上表,捕获与特定聚合名称相关的卷(将作为参数传递),并将卷的大小添加到变量(比如总计)。应该读取下一行,直到变量,total小于或等于应该移动的大小(再次作为参数传递)
如果<aggr1>
和<152GB>
作为参数传递
vol1 aggr1 2GB
vol3 aggr1 150GB
答案 0 :(得分:0)
您希望逐行读取文件,因此您可以使用awk。您使用语法-v aggr=<aggr>
提供参数。您将在命令行输入:
awk -f script.awk -v aggr=aggr1 -v total=152 tabfile
这是一个awk脚本:
BEGIN {
if ( (aggr == "") || (total == 0.) ) {
print "no <aggr> or no <total> arg\n"
print "usage: awk -f script.awk -v aggr=<aggr> -v total=<total> <file_data>"
exit 1;}
sum = 0;
}
$0 ~ aggr {
scurrent = $6; sub("GB","", scurrent);
sum += scurrent;
if (sum <= total) print $2 "\t" $3 "\t" $6;
else exit 0;
}
BEGIN块在开始时被解释一次!在这里初始化sum变量,并检查是否存在强制参数。如果它们丢失,则它们的值为空。
脚本将逐行读取文件,并且只处理包含aggr参数的行。
感谢$及其NUM引用每列;您的卷大小位于$6
列中。