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 4lee hasta cuatro líneas de su archivo de texto. -
readpuede 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