我有另一个cron作业,我试图直接在电子邮件正文中显示csv数据,其输出如下:
正如您在上面所看到的,电子邮件的输出是扭曲的,看起来很丑陋。我应该使电子邮件格式与csv格式类似吗?
我在我的cron中使用以下bash命令:
EMAILBODY="$(${RUNDIR}/${DEV1} ${FILELOCATION} ${FILENAME})"
echo "$EMAILBODY" | mailx -r ${SENDER} -s "Alerts Email for $(date +%Y-%m-%d_%H:%M)" abcd@xyz.com
我尝试了以下对脚本的更改:
echo "$EMAILBODY" | column -s, -t | mailx -r ${SENDER} -s "Alerts Email for $(date +%Y-%m-%d_%H:%M)" abcd@xyz.com
正如您所注意到的,格式比以前好一些。但是,如何将数据与标题完美对齐?
答案 0 :(得分:1)
Perl将是一个用于对齐文本字段的合适工具。 请尝试以下代码:
#!/bin/bash
echo "$EMAILBODY" | perl -e '
format STDOUT =
@>>>>>>> @<<<<<<<<<<<<<<<<<< @>>>>>>> @<<<<<<<<<<<<<< @<<<<<<<< @<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$id, $type, $site, $city, $prov, $start, $elasp
.
while (<>) {
split(/,/, $_);
grep {s/^"//, s/"$//} @_;
($id, $type, $site, $city, $prov, $start, $elasp) = @_;
write;
}'
结果如下:
Alert ID Type IOL Site City Province Alert Start Time Elasped Time since first alert
4 Trasaction Alert 99196 NANAIMO BC 2015-06-30 15:11:00 867 23:00
6 Communication Alert 88395 GRANDE PRAIRIE AB 2015-07-01 15:23:39 866 22:48
7 Communication Alert 88433 HINTON AB 2015-07-01 15:23:39 866 22:48
8 Communication Alert 88484 LAC LA BICHE AB 2015-07-01 15:23:39 866 22:48
11 Transation Alert 88395 GRANDE PRAIRIE AB 2015-07-02 16:40:59 865 22:53
请注意,上面的脚本假定每个字段都不包含逗号。在这种情况下,Text :: CSV模块将起作用。
希望这有帮助。
答案 1 :(得分:0)
我在电子邮件正文中使用了TAB分隔字段,这使得它更具人性化。我个人虽然喜欢将实际的csv文件作为附件发送,但它可以通过电子表格程序打开和操作。我通常不会将信息通过电子邮件发送给自己,而接收端通常只是一个基本的Windows用户。可选地,有一个很棒的perl模块,它允许你编写一个真正的excel文件,这可以给出一些很棒的结果。的Excel ::作家:: XLSX
答案 2 :(得分:0)
首先,说你有“一个看起来像下面的csv文件”并不准确。当您在电子表格程序中打开它时,您有一个CSV文件。
这里有一些问题需要解决。使用columns
是一个好主意,但columns
(像许多Unix命令行实用程序一样)认为每个人仍然使用固定宽度字体的Unix控制台。您看到的轻微错位取决于您使用比例字体查看电子邮件,因此并非所有字符都具有相同的宽度。
您可以尝试使用制表符分隔输出。这看起来会更好 - 但仍然会有一些不起作用的情况(因为你并不总是需要在列之间只有一个标签才能让它们排成一行。
保证所需外观的唯一方法是创建内容类型为“text / html”的MIME电子邮件,并创建包含数据的HTML表格。但是,你正在做的事情还有很多工作要做。