bash 逐行读取 table 的脚本

bash script to read table line by line

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

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%

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

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

vol1         aggr1        2GB      
vol3         aggr1        150GB   

您想逐行读取文件,所以可以使用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;
}   

[=11=] ~ aggr {
    scurrent = ;  sub("GB","", scurrent);
    sum += scurrent;
    if (sum <= total)   print   "\t"  "\t" ;
    else   exit 0;
}

BEGIN 块在开头被解释一次!此处初始化 sum 变量并检查是否存在强制参数。如果它们缺失,则它们的值为 null。

脚本将逐行读取文件,并且只处理包含 aggr 参数的行。

每一列都由 $ 及其 NUM 引用;您的卷大小在 .

列中