Скрипт bash для чтения таблицы построчно

Пример ввода: (значения, разделенные табуляцией в табличном формате)

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   

1 ответ

Решение

Вы хотите читать файл построчно, чтобы использовать 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 интерпретируется один раз, в начале! Здесь вы инициализируете переменную суммы и проверяете наличие обязательных аргументов. Если они отсутствуют, их значение равно нулю.

Скрипт будет построчно читать файл и обрабатывать только строки, содержащие аргумент aggr.

Каждый столбец упоминается благодаря $ и его NUM; ваш объем тома находится в столбце $6,

Другие вопросы по тегам