
Creé una secuencia de comandos que usa a for loop
para recorrer una secuencia de comandos de IBM para obtener el tamaño de los directorios. Luego, el script genera el tamaño del directorio y la ruta a un canal de Slack para una fácil visualización. El programa funciona, pero el resultado del script de IBM es grande y necesita formateo para que sea fácil de leer en Slack. Por lo tanto, necesito recopilar dos datos que se canalizarán en dos variables separadas y las variables se utilizarán para crear el mensaje de Slack. Mi guión se parece a:
SIZE () {
for dir in /path/to/dir/*
do
cd /usr/lpp/mmfs/samples/ilm/
SLACKMESSAGE=$(./mmpolicy-du.sample "$dir" -t /mmfs1/.policytmp -g /mmfs1/.policytmp/ -N all -v -h)
SLACK
done
}
También lo /path/to/dir/*
es el directorio principal y el script de IBM ./mmpolicy-du.sample "$dir" -t /mmfs1/.policytmp -g /mmfs1/.policytmp/ -N all -v -h
recorrerá todos los directorios secundarios (un nivel de profundidad) y obtendrá su tamaño. La salida se parece a:
[I] 2018-05-31@16:32:55.798 Policy execution. 0 files dispatched.
[I] 2018-05-31@16:32:55.804 Policy execution. 0 files dispatched.
File system scan complete.
534.5M total
mmapplypolicy du for /path/to/directory/SPI/ complete at Thu May 31 17:32:55 2018
Ese no es el resultado más limpio, por lo que me gustaría canalizar el tamaño del directorio en el caso de ejemplo anterior 534.5M
a una variable llamada SIZE
y a SPI
otra variable llamada PROJECT
. Por supuesto, al ser un bucle, la SIZE
variable PROJECT
y cambiará en cada directorio dentro del ejemplo anterior de /path/to/dir/
. La función de Slack que se llama en mi función anterior utilizará esas dos variables. Estoy luchando por descubrir cómo convertir esos dos en variables. ¿Alguien tiene una solución? ¡Gracias!
Respuesta1
Para hacerlo de una vez:
eval "$(yourscript | awk -v q=\' '
$1 ~ /^[[:digit:]]+(\.[[:digit:]]+)?[MGT]$/ {
print "SIZE=" $1
}
match($0, /[[:upper:]]{3}/) {
print "PROJECT="q substr($0, RSTART, RLENGTH) q
}')"
Tenga en cuenta que algunas awk
implementaciones como nawk
Solaris mawk
o versiones anteriores de gawk
no admiten los {x,y}
operadores {x}
de intervalo de expresión regular (en el caso de versiones anteriores (y no antiguas) gawk
, puede ejecutarlas POSIXLY_CORRECT=anything
en el entorno para que las admita). aunque) a pesar de que ha sido estándar durante más de 25 años. Con esos, necesitarías reemplazarlos [[:upper:]]{3}
con [[:upper:]][[:upper:]][[:upper:]]
.
Respuesta2
Dudo mucho que esto sea lo que necesita, pero esto responde palabra por palabra a su pregunta actual.
Primera parte (asumiendo GNU grep
o compatible):
project="$(yourscript|grep -oE '[[:upper:]]{3}')"
Segunda parte:
size="$(yourscript|grep -oE '[[:digit:]]+(\.[[:digit:]]+)?[MGT]')"
Combinado, es más sencillo ejecutar el script una vez, guardar el resultado y realizar grep y asignarlo en el resultado guardado:
output="$(script)"
size="$(printf '%s\n' "$output"|grep -oE '[[:digit:]]+(\.[[:digit:]]+)?[MGT]')"
project="$(printf '%s\n' "$output"|grep -oE '[[:upper:]]{3}')"
Alguna explicación
grep -o
: solo devuelve el objeto agrupado, no la línea completa
-E
. - Expresión regular extendida
[[:upper:]]
: coincide solo con letras mayúsculas ([AZ], pero independientemente de la configuración regional)
{3}
: limita la coincidencia a exactamente 3 caracteres consecutivos.
[[:digit:]]
- coincidir con dígitos ([0-9], nuevamente sin tener en cuenta la configuración regional)
+
- coincidir 1 o más veces
\.
- coincidir con un punto
(...)?
- coincidir 0 o 1 veces - esto garantiza que los números sin un punto decimal también puedan ser capturados
[xy]
- coincidir exactamente con uno de los elementos x o y.