que - scripts bash ejemplos
Leer líneas de File in Bash y analizar palabras en variables para los parámetros de mailx (2)
Tengo un script bash que lee líneas de un archivo de texto con 4 columnas (sin encabezados). El número de líneas puede ser como máximo de 4 líneas o menos. Las palabras en cada línea están separadas por el carácter ESPACIO.
[email protected] [email protected];[email protected] Sub1 MailBody1
[email protected] [email protected];[email protected] Sub2 MailBody2
[email protected] [email protected];[email protected] Sub3 MailBody3
[email protected] [email protected];[email protected] Sub4 MailBody4
Actualmente, estoy analizando el archivo y después de obtener cada línea, estoy almacenando cada palabra en cada línea en una variable y llamando a mailx cuatro veces. Se pregunta si hay una solución elegante awk / sed a la lógica mencionada a continuación.
- encontrar el número total de líneas
- mientras
read $line
, almacena cada línea en una variable - analizar cada línea como
i=( $line1 )
,j=( $line2 )
etc. - Obtenga valores de cada línea como
${i[0]}
,${i[1]}
,${i[2]}
y${i[3]}
etc. - llame a
mailx -s ${i[2]} -t ${i[1]} -r ${i[0]} < ${i[3]}
- analizar la siguiente línea y llamar a
mailx
- haz esto hasta que no se hayan alcanzado más líneas o un máximo de 4 líneas
¿Awk o sed proporcionan una solución elegante a la lógica de iteración / bucle anterior?
Dale una oportunidad:
head -n 4 mail.txt | while read from to subject body; do
mailx -s "$subject" -t "$to" -r "$from" <<< "$body"
done
-
head -n 4
lee hasta cuatro líneas de su archivo de texto. -
read
puede leer múltiples variables de una línea, por lo que podemos usar variables con nombre para la legibilidad. -
<<<
es probablemente lo que quieres para la redirección, en lugar de<
. Probablemente.
El ciclo while anterior funciona bien como una alternativa simple a sed y awk si tienes mucho control sobre cómo mostrar las líneas de texto en un archivo. el comando de lectura también puede usar un delimitador específico, usando el indicador -d.
Otro ejemplo simple:
Había usado mysql para obtener una lista de usuarios y hosts, colocándola en un archivo / tmp / userlist con texto como se muestra:
user1 host1
user2 host2
user3 host3
Pasé estas variables a un comando mysql para obtener información de concesión para estos usuarios y hosts y anexar a / tmp / grantlist:
cat /tmp/userlist | while read user hostname;
do
echo -e "/n/nGrabbing user $user for host $hostname..."
mysql -u root -h "localhost" -e "SHOW GRANTS FOR ''$user''@$hostname" >> /tmp/grantlist
done