AWK подготавливаем не размеченные диски - denis-kol4ev/OraDBA GitHub Wiki
Подготавливаем не размеченные диски для ASM групп с помощью parted
root#>
lsblk -l\
|awk '{if ( (index($0,"part") + index($0,"lvm"))==0 ) {if ( (index(prev,"part") + index(prev,"lvm"))==0 ) {if (length(prev) > 0 ) print prev}}; prev=$0} END {if ( (index(prev,"part")+index(prev,"lvm"))==0 ) print prev}'\
|egrep "1T|2T|200G|500G|512G|1000G|150G|50G"\
|sort -u\
|awk '{print "disk size: "$4" cmd: parted -s -a optimal /dev/"$1" mklabel gpt mkpart primary 0% 100%"}'
Как это работает:
- $0 - целая строка
- index($0,"part") - проверяет наличие подстроки part в $0, если не находит возвращает 0, если находит возвращает номер позиции где начинается искомая подстрока
- выполняется конструкция if then else, в awk имеет вид if (condition) {then-body} else {else-body}
{if ( (index($0,"part") + index($0,"lvm"))==0 ) {if ( (index(prev,"part") + index(prev,"lvm"))==0 ) {if (length(prev) > 0 ) print prev}}; prev=$0}
в этом примере используется if then без else с глубиной if = 3, т.е. if () {if () {if () {} }}
Логика работы:
- на первом условии if определяется отсутствие в строке $0 подстрок part и lvm
- переходим в then и вызываем 2-е условие if
- проверяем отсутствие в строке заданной переменной prev подстрок part и lvm, при обработке первой строки переменная prev не задана
- переходим в then и вызываем 3-е условие if
- проверяем что длина prev не нулевая и если это так печатаем, для первой строки prev нулевой длины, поэтому не выводится на печать
- по завершению наружного (первого) if блока после ; переменной prev присваивается значение текущей строки
- обрабатывается следующая строка , в переменной prev уже присутствует значение для сравнения, соответственно если в текущей строке и в prev переменной отсутствуют part и lvm , значит это строки с disk, и если после строки с disk идет строка с disk , то на печать выводится prev строка. В случае, если текущая строка lvm или part , то prev не выводится т.к. в данном случае диск имеет партицию или является частью lvm. В конце обработки каждой строки ее значение присваивается prev.
- END {if ( (index(prev,"part")+index(prev,"lvm"))==0 ) print prev} заключительная конструкция END отрабатывает один раз, в самом конце, она нужна для того чтобы когда последняя строка записалась в prev для нее выполнилась проверка является ли эта строка диском и если да то напечатать ее.