Как перебрать столбец в awk? - PullRequest
0 голосов
/ 17 мая 2018

Когда я делаю

/usr/lib64/nagios/plugins/check_disk -w 20% -c 10% -A -I '/run/*' -I '/tmp/*' | cut -f2 -d"|" | \
awk '{
  for (i = 1; i <= NF; i++){
    print $i
  }
}'

Я получаю

/dev=0MB;6356;7151;0;7946
/dev/shm=74MB;6367;7163;0;7959
/sys/fs/cgroup=0MB;6367;7163;0;7959
/=12975MB;12792;14391;0;15990
/home=139507MB;190780;214627;0;238475
/mnt/dat0=2316MB;35376;39798;0;44221

Вопрос

Как я могу зациклить каждый элемент в $iразделены ;?

Ответы [ 4 ]

0 голосов
/ 17 мая 2018
#!/bin/bash

/usr/lib64/nagios/plugins/check_disk -w 20% -c 10% -A \
| cut -d'|' -f2- | xargs printf '%s\n' | sed 's/=/;/' \
| awk -F';' '{
    print "---"
    print "Path: " $1
    print "Size: " $2
    print "Warn: " $3
    print "Crit: " $4
    print "Min: " $5
    print "Max: " $6
    print "---"
}'

cut -d'|' -f2- выбирает данные исполнения.

xargs printf '%s\n' помещает каждую запись в отдельной строке.

sed 's/=/;/' заменяет первые = в каждой строке на ; для удобства.

awk -F';' … разбивает каждую строку на ; и назначает позиционные параметры как обычно.

0 голосов
/ 17 мая 2018

Используйте функцию split() с регулярным выражением, установленным на [;=], чтобы получить каждое поле в массив a.

/usr/lib64/nagios/plugins/check_disk -w 20% -c 10% -A -I '/run/*' -I '/tmp/*' | awk -F'|' '{
  split($2, a, "[;=]");
  for(i in a){
      print a[i]
  }
}' 

Обратите внимание, что команду cut можно заменить на awk -F'|'используя 2-е поле.

0 голосов
/ 17 мая 2018

Вы можете попробовать

awk '1' RS=';' ORS='\n'

После вашей команды ... check_disk ... | cut -f2 -d "|"
Вы получаете строку как / dev = 0MB; 6356; 7151; 0; 7946
Awk ничего не делает, потому что по умолчанию FS (разделитель полей) - это пробел и в ваших строках нет пробела.
Если вы скажете awk, что RS = ';'
Каждая запись заканчивается на «;»
Для каждой прочитанной строки awk находит более 1 записи.
Если вы скажете awk, что ORS (разделитель выходных полей) = "\ n"
awk печатать каждую запись в новой строке
Так с предыдущей строкой
awk '1' RS = ';' ORS = '\ п'

вы получите:

/ DEV = 0MB * +1021 * 6356
7151
0
7946

Этот awk очень прост - печать только одного сообщения awk.

0 голосов
/ 17 мая 2018

Вам необходимо изменить флаг разделителя.Используйте awk -F ';'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...