2015-01-21 3 views
0

Я использую ksh.Чтение из файла с разделителями символов и назначение в переменные | ksh Unix shell

Мне нужно прочитать данные из файла, в переменные, а затем использовать их для отправки писем.

  • Файл может быть разделен символами менее используемых символов (например, |^и т. Д.) Или группой символов.
  • Необходимо получить почта из, почта в, куб. Куб. См, субъект, корпус из файла.
  • Я наматываю файл в таблицу, поэтому разделитель может быть любым символом, но менее используемый в общем английском, потому что в теле есть такие символы, как & * и т. Д., И это может вернуть неправильное значение.

Файл: (куб.см и ОЦК не доступны в файле т.е. они являются пустыми)

[email protected]|[email protected]|||TEST EMAIL FOR LMS ERROR|Hi <<FIRST_NAME>>, <br><br> 

Following errors are generated during migration of LMS data into FIMS application.<br><br><br> 
The respective details of Error(s) occured is logged into the attached file. 
Regards,<br> 
FIMS Web Application<br><br><br> 

This is an auto-generated e-mail, please don't reply to this e-mail 
Reply to the following person for further details: 
[email protected] 

код с помощью:

while IFS='|' read -r a1 a2 a3 a4 a5 a6 
do 
flag1=`echo $a1` 
flag2=`echo $a2` 
flag3=`echo $a3` 
flag4=`echo $a4` 
flag5=`echo $a5` 
flag6=`echo $a6` 
done < $RUNTIME/EMAIL_$System`date +%y%m%d`.csv 

Он не устанавливает переменные.

А при использовании кода ниже: Это показывает нежелательную выход:

while IFS='|' read -r a1 a2 a3 a4 a5 a6 
do 
echo $a1 
echo $a2 
echo $a3 
echo $a4 
echo $a5 
echo $a6 
done < $RUNTIME/EMAIL_$System`date +%y%m%d`.csv 

Выход: (ад много пустых строк)

[email protected] 
[email protected] 


TEST EMAIL FOR LMS ERROR 
Hi <<FIRST_NAME>>, <br><br> 






Following errors are generated during migration of LMS data into FIMS application.<br><br><br> 





The respective details of Error(s) occured is logged into the attached file. 





Regards,<br> 





FIMS Web Application<br><br><br> 











This is an auto-generated e-mail, please don't reply to this e-mail 





Reply to the following person for further details: 





[email protected] 
+0

Не нужно просто разобрать первую строку? – SMA

+0

Это не только одна строка. Вместо этого это только одна единственная запись. И проблема в том, что последняя запись - BODY электронной почты, которая действительно имеет много строк сама по себе. – Sachin

+0

Может ли использовать 'cut' для назначения каждой переменной? 'cut -f1 -d '|'' используя f1-f6? – Jmoreland91

ответ

0

В KSH, последней командой в конвейере выполняется в текущей оболочке.

Я обработал бы первую строку, а затем добавлю все остальные строки к переменной body.

file="$RUNTIME/EMAIL_$System$(date +%y%m%d).csv" 
sed 1q "$file" | IFS="|" read -r from to cc bcc subj body 
body="$body 
$(sed 1d "$file")" 

printf "%s: %s\n" from "$from" to "$to" cc "$cc" bcc "$bcc" subj "$subj" body "$body" 
from: [email protected] 
to: [email protected] 
cc: 
bcc: 
subj: TEST EMAIL FOR LMS ERROR 
body: Hi <<FIRST_NAME>>, <br><br> 

Following errors are generated during migration of LMS data into FIMS application.<br><br><br> 
The respective details of Error(s) occured is logged into the attached file. 
Regards,<br> 
FIMS Web Application<br><br><br> 

This is an auto-generated e-mail, please don't reply to this e-mail 
Reply to the following person for further details: 
[email protected] 

Я иногда люблю использовать sed вместо head/tail

+0

Единственная проблема только в BODY, и вот она появилась снова. Все остальные поля отображаются отлично, но для тела он показывает эту ошибку 'generate_error_file.ksh [174]: body + = $ \ n: not found' .. PS: Я новичок в оболочке, поэтому не так много знание этого. – Sachin

+0

Кроме того, я узнал, какое альтернативное решение состоит в том, чтобы разматывать BODY отдельно в другом файле, а затем использовать его. В любом случае я буду использовать этот файл непосредственно как тело в команде 'mailx'. – Sachin

+0

У вас может быть более старая ksh. Я обновил способ добавления текста к переменной body –

0

Я использовал команду cut и, казалось, хорошо работать назначая их переменных. Хотя, я не уверен, будет ли в вашем файле несколько записей.

Testing.sh

#!/usr/bin/ksh 

a1=$(cat test.txt | cut -f1 -d '|' -s) 
a2=$(cat test.txt | cut -f2 -d '|' -s) 
a3=$(cat test.txt | cut -f3 -d '|' -s) 
a4=$(cat test.txt | cut -f4 -d '|' -s) 
a5=$(cat test.txt | cut -f5 -d '|' -s) 
a6=$(cat test.txt | cut -f6 -d '|') 

echo $a1 
echo $a2 
echo $a3 
echo $a4 
echo $a5 
echo $a6 

тест.TXT

[email protected]|[email protected]|||TEST EMAIL FOR LMS ERROR|Hi <<FIRST_NAME>>, <br><br> 

Following errors are generated during migration of LMS data into FIMS application.<br><br><br> 
The respective details of Error(s) occured is logged into the attached file. 
Regards,<br> 
FIMS Web Application<br><br><br> 

This is an auto-generated e-mail, please don't reply to this e-mail 
Reply to the following person for further details: 
[email protected] 

выход:

$Testing.sh 
[email protected] 
[email protected] 


TEST EMAIL FOR LMS ERROR 
Hi <<FIRST_NAME>>, <br><br> Following errors are generated during migration of LMS data into FIMS application.<br><br><br> The respective details of Error(s) occured is logged into the attached file. Regards,<br> FIMS Web Application<br><br><br> This is an auto-generated e-mail, please don't reply to this e-mail Reply to the following person for further details: [email protected]