Скрипт 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
,