bash脚本逐行读取表

时间:2018-02-27 11:12:52

标签: bash shell netapp

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

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   

1 个答案:

答案 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列中。