Necesito hacer un script bash para comparar el espacio de un vg en servidores redhat. Lo que tengo hasta ahora es:
#!/bin/bash ##VARS CMD=$(vgs | grep vgSoft | awk -F" " '{print $7}' | awk -F"<" '{print $2}'| awk -F"g" '{print $1}') SPACE="10.00" if [[ "$CMD" < "$SPACE" ]]; then echo "It's not enough space, you must extend the VG" echo "Space is equal to: $CMD GB" elif [[ "$CMD" == "$SPACE" ]]; then echo "It's enough space but consider extend the VG" elif [[ "$CMD" > "$SPACE" ]]; then echo "It's enough space" echo "Space is equal to: $CMD GB" fi Lo que hago con este comando es obtener la salida de los grupos de volumen y analizar los datos para obtener el valor deseado vgs | grep vgSoft | awk -F" " '{print $7}' | awk -F"<" '{print $2}'| awk -F"g" '{print $1}' y guárdelo en la variable CMD. Donde la salida del comando vgs es:
[root@server~]# vgs VG #PV #LV #SN Attr VSize VFree vgSoft 2 13 0 wz--n- 71.99g <26.14g vgSys 1 12 0 wz--n- <63.51g <36.52gEntonces, en este caso, el resultado de mi variable CMD es 26,14 y estoy haciendo la comparación con el valor 10,00 (que está asignado a la variable ESPACIO).
Pero tengo un problema al comparar las cadenas, porque si la salida del comando vgs es, por ejemplo, 9.46, el script me dice que "hay suficiente espacio" cuando la salida debería ser "No hay suficiente espacio, debe extender el VG" . Por lo que recuerdo, no puedo usar los operadores "eq" "gt" "ne" porque estoy comparando con cadenas y no con valores enteros.
Con sus muestras mostradas, intente seguir el código awk . Podemos hacer todo esto en un solo awk .
Tenemos un space con nombre de variable awk donde he definido el valor como 10 según los intentos mostrados de OP, uno podría cambiarlo según sea necesario.
vgs | awk -v space="10" ' FNR==1 || !/vgSoft/{ next } { value=substr($7,2,length($7)-1)+0 } value<space { print "It\047s not enough space, you must extend the VG" next } value==space{ print "It\047s enough space but consider extend the VG" next } value>space { print "It\047s enough space" } ' O en caso de que tenga el séptimo campo en las líneas que podrían O no podrían tener un < inicial en su valor, por lo que para lidiar con este tipo de situaciones, intente seguir el código awk .
vgs | awk -v space="10" ' FNR==1 || !/vgSoft/{ next } { sub(/^</,"",$7) value=$7+0 } value<space { print "It\047s not enough space, you must extend the VG" next } value==space{ print "It\047s enough space but consider extend the VG" next } value>space { print "It\047s enough space" } ' Explicación: Ejecutar primero el comando vgs y enviar su salida estándar como entrada estándar al programa awk . En el programa awk , se crea space variable con un valor de 10 según los intentos mostrados. Luego, en el programa principal, verifique la(s) condición(es) si su primera línea O la línea no contiene la cadena vgSoft y luego simplemente salte a la siguiente línea. Si una línea contiene una cadena vgSoft , entonces se crea una variable con el nombre de value que tendrá el valor del 7.° campo de la línea actual (sin < y g del 7.° campo), luego se usan 3 condiciones para verificar (si el valor es igual a O menor que O mayor que espacio o no) en consecuencia imprimiendo declaraciones entonces.
Advertencia justa: no tengo el comando vgs conmigo, así que probé este código colocando su salida de muestra del comando vgs en un Input_file y ejecutándolo contra el programa awk y funcionó bien para mí.
Puede usar el comando echo en combinación con bc para comparar, como se muestra a continuación.
$ SPACE=10.00 $ CMD=9.46 $ echo "${CMD}>${SPACE}" | bc 0 $ CMD=10.46 $ echo "${CMD}>${SPACE}" | bc 1awk en solo un momento:
vgs | awk -v space=10.00 '/vgSoft/ { free = substr($7, 2, length($7) - 2)+0 # Assumes the < and g will always be there if (free < space) { print "It'"'"'s not enough space, you must extend the VG" print "Space is equal to: " space " GB" } else if (free == space) { print "It'"'"'s enough space but consider extend the VG" } else { print "It'"'"'s enough space" print "Space is equal to: " space " GB" } exit }'