2010-09-03 9 views
4

J'ai la ligne suivante dans un script Nagios bash. Il est utilisé pour obtenir les taux d'erreur haut et bas pour les cartes réseau spécifiées:AWK: Ces instructions sont-elles requises?

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

Je ne l'ai jamais travaillé avec awk avant aujourd'hui, donc je trouve mon chemin un peu. Comme je le vois, nous passons la valeur $ INTERFACE dans le script awk comme interface, puis filtre pour les lignes commençant interface: (par exemple eth0 :). Ensuite, nous divisons la ligne en utilisant l'espace-deux-points comme séparateur. Ensuite, pour une raison quelconque, nous affectons la troisième entrée du tableau à $ 0 avant d'extraire réellement les valeurs que nous voulons.

Il me semble que les déclarations split($0, a, /: */) et $0 = a[2] ne sont pas nécessaires mais je peux me tromper! Est-ce que l'assignation d'un [2] à 0 $ change quelque chose quand on parle alors de 3 $ et de 11 $? J'ai essayé le script sans les deux premières déclarations et la sortie est la même, mais peut-être il y a une affaire coin, je l'ai raté ...

Merci à l'avance

Rich

Répondre

2

Le split () est inutile. Ceci est le même que votre déclaration awk

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

alternativement, vous pouvez utiliser le shell (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}"