AWK: Требуются ли эти заявления? - PullRequest
4 голосов
/ 03 сентября 2010

У меня есть следующая строка в bash-скрипте Nagios. Он используется для получения коэффициентов ошибок вверх и вниз для указанных сетевых карт:

if=`awk -v interface="$INTERFACE" '$1 ~ "^" interface ":" { split($0, a, /: */); $0 = a[2]; print $3 " " $11 }' /proc/net/dev`

До сегодняшнего дня я никогда не работал с awk, поэтому немного нахожу свой путь.

На мой взгляд, мы передаем значение $ INTERFACE в скрипт awk в качестве интерфейса, а затем фильтруем строки, начинающиеся interface: (например, eth0 :). Затем мы разделяем строку, используя двоеточие в качестве разделителя. Затем по какой-то причине мы присваиваем третью запись в массиве $ 0, прежде чем фактически извлечь нужные значения.

Мне кажется, что утверждения split($0, a, /: */) и $0 = a[2] не нужны, но я могу ошибаться! Меняет ли что-либо присвоение [2] $ 0, когда мы ссылаемся на $ 3 и $ 11? Я пробовал сценарий без первых двух утверждений, и вывод такой же, но, возможно, я пропустил угловой случай ...

Заранее спасибо

Rich

1 Ответ

2 голосов
/ 03 сентября 2010

Разделение () не требуется.Это то же самое, что и ваш оператор awk

awk -v interface="eth0" '$1~interface{print $3,$11 }' /proc/net/dev

, в качестве альтернативы вы можете использовать оболочку (bash / ksh)

shopt -s extglob
var=$(< /proc/net/dev)
var="${var##*$interface:+( )}"  # remove everything until and including the interface
var="${var%%$'\n'*}"  #remove from first newline onwards
set -- $var  
echo "$3 ${11}"
...