Bash 将CSV格式转换为电子邮件正文中的文本
我有一个cron作业,运行该作业时会生成一个csv文件,如下所示: 我有另一个cron工作,我试图在电子邮件正文中直接显示csv数据,其输出如下: 正如您在上面看到的,电子邮件的输出是扭曲的,看起来很难看。要使电子邮件格式与csv格式相似,我应该做哪些更改 我在cron中使用以下bash命令:Bash 将CSV格式转换为电子邮件正文中的文本,bash,perl,csv,cron,Bash,Perl,Csv,Cron,我有一个cron作业,运行该作业时会生成一个csv文件,如下所示: 我有另一个cron工作,我试图在电子邮件正文中直接显示csv数据,其输出如下: 正如您在上面看到的,电子邮件的输出是扭曲的,看起来很难看。要使电子邮件格式与csv格式相似,我应该做哪些更改 我在cron中使用以下bash命令: EMAILBODY="$(${RUNDIR}/${DEV1} ${FILELOCATION} ${FILENAME})" echo "$EMAILBODY" | mailx -r ${SENDER}
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
现在我在电子邮件中看到:
正如您所注意到的,格式比以前稍微好一点。但是,我如何才能将数据与标题完美地对齐呢?我在电子邮件正文中使用了制表符分隔的字段,这使它更具可读性。就我个人而言,我喜欢将实际的csv文件作为附件发送,这样就可以通过电子表格程序打开和操作它。我通常不会通过电子邮件向自己发送信息,接收端通常只是一个基本的Windows用户。另外,还有一个很好的perl模块,它允许您编写一个真正的excel文件,它可以提供一些非常好看的结果。Excel::Writer::XLSX我在电子邮件正文中使用了制表符分隔的字段,这使它更具可读性。就我个人而言,我喜欢将实际的csv文件作为附件发送,这样就可以通过电子表格程序打开和操作它。我通常不会通过电子邮件向自己发送信息,接收端通常只是一个基本的Windows用户。另外,还有一个很好的perl模块,它允许您编写一个真正的excel文件,它可以提供一些非常好看的结果。Excel::Writer::XLSXPerl将是对齐文本字段的合适工具。 请尝试以下代码:
#!/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;
}'
请注意,上面的脚本假定每个字段不包含逗号。在这种情况下,Text::CSV模块将起作用
希望这能有所帮助。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;
}'
请注意,上面的脚本假定每个字段不包含逗号。在这种情况下,Text::CSV模块将起作用
希望这能有所帮助。首先,说你有“如下所示的csv文件”是不准确的。您有一个CSV文件,当您在电子表格程序中打开它时,它看起来就是这样 你有几个问题要解决。使用
columns
是个好主意,但是columns
(与许多Unix命令行实用程序一样)认为每个人仍然生活在具有固定宽度字体的Unix控制台中。你看到的轻微的不一致是由于你使用比例字体查看电子邮件,所以不是所有的字符都是相同的宽度
您可以尝试用制表符分隔输出。这看起来会更好,但仍然会有一些情况不起作用(因为您并不总是需要在列之间正好有一个选项卡才能使它们对齐)
保证您想要的外观的唯一方法是创建一封内容类型为“text/html”的MIME电子邮件,并创建一个包含您的数据的html表。但这比您目前正在做的工作要多得多。首先,说您有“如下所示的csv文件”并不准确。您有一个CSV文件,在电子表格程序中打开时,它看起来就是这样 这里有一些问题需要解决。使用
列
是个好主意,但是列
(与许多Unix命令行实用程序一样)认为每个人仍然生活在一个具有固定宽度字体的Unix控制台中。您看到的轻微错位是由于您使用比例字体查看电子邮件,因此并非所有字符的宽度都相同
你可以尝试用制表符来分隔输出,这样看起来会更好,但是仍然会有一些情况不起作用(因为你并不总是需要在列之间只使用一个制表符来对齐它们)
保证外观的唯一方法是创建内容类型为“text/html”的MIME电子邮件创建一个包含数据的HTML表格。但这比您目前正在做的工作要多得多。我认为最好使用libreoffice calc打开一个csv。在电子邮件正文中,使用printf逐行打印,每个字段的格式和对齐方式与在控制台中打印相同;然后使用monospace字体打开并显示电子邮件。Alternatevely打印带有…的html电子邮件正文,不要将图像发布到代码(或数据)中,发布实际文本。我认为最好使用libreoffice calc打开csv。在电子邮件正文中,使用printf逐行打印,每个字段的格式和对齐方式与在控制台中打印时相同;然后使用monospace字体打开并显示电子邮件。或者使用…打印html电子邮件正文,不要将图像发布到代码(或数据),发布实际文本。这与当前的
列
命令所做的差不多。但是,使用比例字体查看时,它看起来仍然是错误的(如问题中的第二幅图像所示).Wow,我想我已经多年没有看到使用格式了!@Sobrique:我是记错了,还是在几次发布后从Perl core中删除了它?这正是当前的列命令所做的。但是使用比例字体查看它时,它仍然看起来是错误的(如问题中的第二张图片所示).Wow,我想我已经多年没有看到使用格式了!@Sobrique:我是记错了,还是在几次发布之前从Perl core中删除了它?