2015-01-12 1 views
1

그래서 나는 아침에 procesed 한 무리를 위해 경쟁 시간을 찾아야한다. 주로 꼬리 -1 파일을 가지고 시간을 확인해야합니다. 나는 그것을 작은 보고서에 자동화했다. 내가 그룹에 보고서를 보내려고 할 때 bash는 전자 메일 프로세스에서 printf 서식을 잃어 버린다.

PROCESS   DATE 
============================================ 
topher_time    06:55.192Z 
big_sync_morning_time  07:15:45 
etime_prod     07:46.952Z 
database_time    08:08:49 
trigger     08:38:13,076 
trans_database_time  08:55:33 

문제

는 - 그것은 모든 이 엉망이 나온다. 나는 모두가 이메일에서 편집자/리더로 html을 사용했기 때문에 그럴 것이라고 생각했습니다. 그래서 나는 몇몇 이메일 태그를 달았습니다.하지만 여전히 엉망입니다. 보고서가 잘 포맷되어 있으므로 보고서를 잘라내어 이메일에 붙여 넣을 수 있습니다. 그러나 프로그램에서 보고서를 이메일로 보내려고하면 서식이 엉망입니다.

#!/bin/bash 
divider======================================================= 
totalwidth=44 
header="\n %-18s %-16s \n" 
format=" %-18s %-16s \n" 

topher=$(tail -1 /come/and/play/topher.log| ~/walt/convert_gm_est) 
big_sync_morning=$(tail -1 /come/and/play/big_sync-morning.log|~/walt/convert_gm_est) 
sub_shell=$(tail -1 /come/and/play/trainer.log|~/walt/convert_gm_est) 
database=$(tail -1 /come/and/play/with/us/danny/database.log) 
trans_c4=$(tail -1 /come/and/play/with/us/danny/regular.sys.log) 
trans_database=$(tail -1 /come/and/play/with/us/danny/database.stdout|~/walt/convert_gm_est) 


topher_time=$(printf "%s " $topher | awk '{print $1}') 
big_sync_morning_time=$(printf "%s " ${big_sync_morning} | awk '{print $1}') 
etime_prod=$(printf "%s " ${sub_shell}| awk '{print $1}') 
database_time=$(printf "%s " $database | awk '{print $5}') 
triggertime=$(printf "%s " $trans_c4 | awk '{print $1}') 
trans_database_time=$(printf "%s " $trans_database | awk '{print $5}') 

mail -s "morning batch completion times" "[email protected]" << END_MAIL 
echo "<html>" 
echo "<body>" 
echo "<pre>" 
printf "$header" PROCESS DATE 
printf "%$totalwidth.${totalwidth}s\n" "$divider" 
printf "$format" \ 
topher "$topher_time" \ 
big_sync_morning "$big_sync_morning_time" \ 
etime_prod "$etime_prod" \ 
database "$database_time" \ 
trans_c4 "$triggertime" \ 
trans_database "$trans_database_time" 

printf "%s\n" 
echo "</pre>" 
echo "</body>" 
echo "</html>" 

END_MAIL 

이것은 명령 줄에서 실행하는 프로세스입니다.

PROCESS   DATE 
============================================ 
topher_time    06:55.192Z 
big_sync_morning_time  07:15:45 
etime_prod     07:46.952Z 
database_time    08:08:49 
trigger     08:38:13,076 
trans_database_time  08:55:33 

이것은 메일로 발송 된 보고서입니다. 이메일로 보입니다.

echo "<html>" 
echo "<body>" 
echo "<pre>" 
printf "\n %-18s %-16s \n" PROCESS DATE 
printf "%44.44s\n" "======================================================" 
printf " %-18s %-16s \n" topher_time "06:55.192Z" big_sync_morning_time "" etime_prod "07:46.952Z" database_time "08:08:49" trigger "08:38:13,076" trans_database_time "08:55:33" 
printf "%s\n" 
echo "</pre>" 
echo "</body>" 
echo "</html>" 

UPDATE하십시오 {} 다음은 메일 명령로 배관의 명령을 주변 는 일 - 좀 다음은 명령을 그룹화하면 printf와 서식을 보존하지 않습니다. 서식을 지정할 수있는 또 다른 방법이 있습니까?

PROCESS   DATE 
============================================ 
topher_time  06:55.192Z 
big_sync_morning_time 07:15:45 
etime_prod  07:46.952Z 
database_time  08:08:49 
trigger   08:38:13,076 
trans_database_time 08:55:33 
+1

여기에있는 문서는 명령을 명령으로 실행하지 않습니다. 쉘이 변수/etc를 처리하는 곳을 제외하고는 리터럴 문자열입니다. 확장. 실제로 실행하려면 HERE 문서의 명령을 실제로 실행해야합니다. 그래서 출력물이 "스크립트"그 자체입니다. –

답변

2

명령을 실행하지 않고 확장하고 인쇄 한 것을 알 수 있습니다. 명령 시퀀스의 결과에서 대신 파이프하려면 다음 명령 그룹을 사용하십시오.

{ 
    echo "<html>" 
    echo "<body>" 
    echo "<pre>" 
    printf "$header" PROCESS DATE 
    ... 
} | mail -s "morning batch completion times" "[email protected]" 
+0

또는 여기 문서의 모든 명령을 수동으로'$ (...) '실행하십시오. 그러나 이것은 더 쉽고 쉬울 것입니다. –

+0

또는 메일을 생성하기위한 명령 전에'exec>> (메일 - "아침 일괄 완료 시간" "[email protected]")'. (그리고 [email protected] 또는 [email protected]을 말하지 않았습니까? :)) – rici

+0

ETAN - 여기 문서에서 명령을 수행 하시겠습니까? – capser

관련 문제