Чтение строк из файла в Bash и анализ слов в переменных для параметров mailx - PullRequest
4 голосов
/ 20 июля 2011

У меня есть скрипт bash, который читает строки из текстового файла с 4 столбцами (без заголовков).Количество строк может быть максимум 4 строки или меньше.Слова в каждой строке разделяются символом пробела.

ab@from.com   xyz@to.com;abc@to.com   Sub1   MailBody1
xv@from.com   abc@to.com;poy@to.com   Sub2   MailBody2
mb@from.com   gmc@to.com;abc@to.com   Sub3   MailBody3
yt@from.com   gqw@to.com;xyz@to.com   Sub4   MailBody4

В настоящее время я анализирую файл и после получения каждой строки я сохраняю каждое слово в каждой строке в переменной и вызываю mailx четыре раза.Интересно, есть ли элегантное решение awk / sed для указанной ниже логики.

  • найдите общее количество строк
  • , а read $line, сохраните каждую строку в переменной
  • анализирует каждую строку как i=( $line1 ), j=( $line2 ) и т. Д.
  • получает значения из каждой строки как ${i[0]}, ${i[1]}, ${i[2]} и ${i[3]} и т. Д.
  • позвоните mailx -s ${i[2]} -t ${i[1]} -r ${i[0]} < ${i[3]}
  • проанализируйте следующую строку и позвоните mailx
  • делайте это до тех пор, пока не будет достигнуто больше строк или максимум 4 строки

Do awk или sedобеспечить элегантное решение для вышеупомянутой логики итерации / зацикливания?

Ответы [ 2 ]

4 голосов
/ 20 июля 2011

Дайте этому шанс:

head -n 4 mail.txt | while read from to subject body; do
    mailx -s "$subject" -t "$to" -r "$from" <<< "$body"
done
  • head -n 4 читает до четырех строк из вашего текстового файла.
  • read может читать несколько переменных из одной строки, поэтому мы можем использовать именованные переменные для удобства чтения.
  • <<< - это, вероятно, то, что вы хотите для перенаправления, а не <. Возможно.
2 голосов
/ 19 мая 2012

Приведенный выше цикл while хорошо работает в качестве простой альтернативы sed и awk, если у вас есть большой контроль над отображением строк текста в файле. Команда чтения также может использовать указанный разделитель, используя флаг -d.

Еще один простой пример:

Я использовал mysql, чтобы получить список пользователей и хостов, поместив его в файл / tmp / userlist с текстом, как показано:

user1 host1
user2 host2
user3 host3

Я передал эти переменные в команду mysql, чтобы получить информацию о грантах для этих пользователей и хостов и добавить в / 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
...