AWK в примерах - denis-kol4ev/OraDBA GitHub Wiki
Функция ceil выполняет округление вверх до ближайшего целого
awk 'function ceil(n){
if (n== int(n))
return n
return int(n)+1};
BEGIN{a = 2.1; print a; print ceil(a)}'
Печатать строк между /pattern1/ и /pattern2/
3.txt
AAA
xxx
BBB
CCC
yyy
DDD
EEE
awk '/xxx/,/yyy/' 3.txt
awk -v start="xxx" -v stop="yyy" 'match($0, start),match($0, stop)' 3.txt
awk '$0 ~ "xxx",$0 ~ "yyy"' 3.txt
awk '/xxx/{flag=1}; {if (flag == 1) print $0}; /yyy/{flag=0}' 3.txt
awk '/xxx/{flag=1}; flag; /yyy/{flag=0}' 3.txt
пояснения по последнему примеру
- /xxx/{flag=1} - находит шаблон и выставляет переменную flag
- flag - это шаблон без указания действия, шаблон вернет 1 и выполнится действия по умолчанию - print $0
- /yyy/{flag=0} - находит шаблон и обнуляет переменную flag
Печатать строк между /pattern1/ и /pattern2/ исключая строки содержащие /pattern1/ и /pattern2/
awk '/xxx/{flag=1}; {if (flag == 1 && $1 != "xxx" && $1 != "yyy") print $0}; /yyy/{flag=0}' 3.txt
awk '/yyy/{flag=0}; flag; /xxx/{flag=1}' 3.txt
awk '/xxx/{flag=1; next}; /yyy/{flag=0}; flag' 3.txt
Функция next - остановка обработки шаблона и переход к следующей строке
Печатать строк между /pattern1/ и /pattern2/ включая /pattern1/
awk '/xxx/{flag=1}; {if ((flag == 1 && $1 != "yyy") || $1 == "xxx") print $0}; /yyy/{flag=0}' 3.txt
awk '/xxx/{flag=1}; /yyy/{flag=0; next}; flag' 3.txt
awk '/xxx/{flag=1}; /yyy/{flag=0}; flag' 3.txt
Печатать строк между /pattern1/ и /pattern2/ включая /pattern2/
awk '/xxx/{flag=1}; {if ((flag == 1 && $1 != "xxx") || $1 == "yyy") print $0}; /yyy/{flag=0}' 3.txt
awk '/xxx/{flag=1; next}; flag; /yyy/{flag=0}' 3.txt
awk 'flag; /xxx/{flag=1}; /yyy/{flag=0}' 3.txt
Если строка содержит шаблон в любой из колонок, то напечатать только колонку которая подходит под условие шаблона
2.txt
xxx yyy zzz
xxx xxx zzz
yyy xxx zzz
zzz xxx yyy
zzz xxx zzz
awk '{tmp = "yyy"; for (i = 1; i <= NF; ++i) if ($i == tmp) print $i}' 2.txt
awk -v tmp="yyy" 'match($0, tmp) {print substr($0, RSTART, RLENGTH)}' 2.txt
yyy
yyy
yyy
Печатает только те А, после которых не следует B
1.txt
A1
A2
B
A3
A4
B
A5
A6
cat 1.txt | awk '{{if ( index($0,"A") !=0 ) {if ( index(prev,"A") !=0 ) {if (length(prev)>0) {print prev}}}}; prev=$0} END {if (index(prev,"A") !=0) {print prev}}'
A1
A3
A5
A6
Альтернативные варианты
cat 1.txt | awk '{if (index($0,"A") !=0) {if (index(prev,"A") !=0) {print prev}}; prev=$0} END {if (index(prev,"A") !=0) {print prev}}'
awk '{
if (prev == 0)
{prev = $1}
else
{cur = $1
if (index(prev, "A") > 0 && index(cur, "A") > 0) print prev
prev = $1}
}
END {if (index(prev, "A") > 0) print prev}' 1.txt
if then else
if then else, в awk имеет вид if (condition) {then-body} else {else-body}
lsblk -l | awk '{if (index($0,"disk") > 0) {y="yes"; print y, $6} else {n="no"; print n, $6}}'
все диски, т.е. все что не part или lvm
lsblk -l | awk '{if ((index($0,"part") + index($0,"lvm"))==0) {print $0}}'
все что part или lvm
lsblk -l | awk '{if ((index($0,"part") + index($0,"lvm"))!=0) {print $0}}'
Объем файлов в папке созданных на определенную дату
ls -la | egrep "Feb 10" | awk '{print $9}' | xargs du -s
ls -la | egrep "Feb 3" | awk '{ sum += $5 } END { print sum/1024/1024/1024 }'
Список установок софта о которых знает инвентори
opatch lsinventory -all | awk "/List of Oracle Homes/,/Installed/" | grep -v "Installed"
Поиск всех запущенных экземпляров oracle
ps -ef | grep _smon_ | grep -v grep | awk '{print $NF}' | sed 's/.*smon_//'
ps -ef | egrep '(ora|asm)_smon_' | awk '{print $NF}' | sed 's/.*_smon_//'
Использование swap процессами
for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r > /tmp/out.txt 2>&1
Характеристики сервера
free -h | awk '/Mem/ {print $2}'
lsblk | grep disk | awk '{print $1, $4, $6}' | sort -k2 -n
lsblk -b | grep disk | awk '{sum += $4; print} END {print "Total size", sum/1024/1024/1024 ,"(Gb)"}'
Сопоставление устройств sd и dm
lvdisplay | awk '/LV Name/{blockdev=$3} /Block device/{bdid=$3; sub("[0-9]*:","dm-",bdid); print bdid,blockdev;}'
Как узнать ORACLE_SID из .bash_profile
cat /home/oracle/.bash_profile | awk '/^(ORACLE_SID=.+|export ORACLE_SID=.+)/ {sub("(ORACLE_SID=|export ORACLE_SID=)", "", $0); print $0}'
Список дисков сервера и их суммарный объём
lsblk | grep disk | awk '{print $1 " " $4; sum += $4} END {print "Total: " sum}'
На сколько необходимо расширить FS чтобы сбросить алерт
df -Pm /appdata/data | \
awk 'function ceil(v){return(v==int(v)) ? v : int(v)+1}
BEGIN {v_alert=80; v_alert_close=75; v_disk_multiple=50}
{if (NR>1 && $5 >= 80)
{v_fs_new = $2 * ($5 / 100) / (v_alert_close / 100);
print "Текущий размер файловой системы", $6, ceil($2/1024) " (Гб), утилизация", $5,
"\nНеобходимо расширить", $6, "на", ceil((v_fs_new - $2)/1024/v_disk_multiple)*v_disk_multiple, "(Гб) для снижения утилизации до", v_alert_close"%",
"\n*кратность расширения", v_disk_multiple" (Гб)"}
else if ((NR>1 && $5 < v_alert))
{print "Утилизация", $6, $5,"порог алерта", v_alert"%"}}'
Вывести из алерт лога только строки не относящиеся к LOGMINER
awk '{if (match($0, /^LOGMINER/) == 1) {if (match(prevrow, /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}/) == 1 || match(prevrow, /^LOGMINER/) == 1) {null}} else {if (match(prevrow, /^LOGMINER/) != 1) {print prevrow}}; prevrow=$0}' alert_orcl.log