0

示例输入:(表格格式的制表符分隔值)

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%

我的任务是查找已超过阈值的聚合下的卷,以便可以将它们移动到不同的聚合中。需要您帮助逐行阅读上表,捕获与特定聚合名称关联的卷(将作为参数传递)并将卷的大小添加到变量(例如总计)。应该读取下一行,直到变量,总计小于或等于应该移动的大小(再次将作为参数传递)

<aggr1>如果和<152GB>作为参数传递时的预期输出

vol1         aggr1        2GB      
vol3         aggr1        150GB   
4

1 回答 1

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

于 2018-02-27T13:19:43.553 回答