无法通过外壳以表格式获取输出

时间:2018-12-09 14:57:39

标签: shell email

下面是代码。我没有以表格格式输出。有人可以帮忙吗?

#!/bin/bash
df -h > /home/test/space.txt
tmp="/home/test/tmp.html"
input="/home/test/space.txt"
echo '<html><body><table border=1>' > "$tmp"
awk '{print "<tr>";for(i=1;i<=NF;i++)print "<td>" $i"</td>";print "</tr>"} END{print "</table></body></html>"}' "$input" >> "$tmp"
 cat $tmp | mail -s "$(echo -e "Test\nContent-Type: text/html")" -r yourmailaddress@...com

在电子邮件中收到如下所示的输出。

<html><body><table border=1> <tr> <td>Use%</td> <td>Avail</td> <td>Used</td> <td>Filesystem</td> </tr> <tr> <td>47%</td> <td>100G</td> <td>90G</td> <td>rootfs</td> </tr> 

1 个答案:

答案 0 :(得分:1)

问题很可能是您的mail程序会将管道输入编码为:

Content-Type: text/plain; charset=us-ascii

(假设您的mail很可能是snailBerkeley mailxheirloom_mailx,它们都是从Berkeley邮件的各种迭代中得出的,这些迭代具有最新的,当前维护的版本{{ 3}})

如果您的mail是提供-a(附加)选项的衍生产品之一,则可能是可行的方法。尽管您的电子邮件正文仍为Content-Type: text/plain,但您的附件将以Content-Type: text/html的形式出现,大多数邮件阅读器将在电子邮件本身中显示该附件(这似乎是您的目标)。

只需对例程进行一些调整,即可将df的输出作为表进行准备,那么您的工作就很好了。唯一进行的调整(可选,但有帮助)是使用快速的sed替换用"Mounted on"替换"Mounted_on",以提供awk可以使用的一致数量的字段使用,然后设置表"width=60%",以防止表呈现压缩的(技术术语)。

例如,包括调整在内,您可以执行以下操作:

tmp=/home/david/tmp/df.html
echo '<html><body><table border=1 width=60%>' > "$tmp"
df | sed 's/Mounted\son/Mounted_on/' | 
awk '{print "<tr>";for(i=1;i<=NF;i++)print "<td>" $i"</td>";print "</tr>"} 
    END
    {print "</table></body></html>"}' >> "$tmp"
echo "df attached" | mailx -s "wizard df" -a "$tmp" david@nirvana

明显的注意事项:根据系统和电子邮件的需要更改分配给tmp的路径)

除了这些调整之外,上述唯一的更改是将html文件“附加”到邮件上,而不是将其转储到邮件中。 mail(但不是全部)的大多数变体都提供了-a(附加)选项。这提供了一种用于将文件作为正确格式和编码附件发送的简单机制。为了提供邮件的正文,我只添加了一个简单的"df attached",并使用echo将文本传递给mail命令。如上所示,mail命令为:

echo "df attached" | mailx -s "wizard df" -a "$tmp" david@nirvana

然后检入较旧版本的Thunderbird,您会找到df信息的表格输出,例如

s-nail 14.9.11-1 (Homepage)

仔细检查一下,让我知道这是否是您要尝试的内容,以及是否能够在您的命令行邮件程序版本中找到-a(附加)选项(如果没有,我建议检查您的发行版提供s-nail还是heirloom-mailx。对于一个很小的软件包,这两个实现提供了强大的命令行邮件功能)

编辑每个请求以在邮件正文中将其编码为"text/html"

在这里,很大程度上取决于您拥有的mail/mailx/s-nail软件包。使用s-nail(通常也别名为mailx),-M选项可让您为Content-type上的正文指定stdin电子邮件。在这种情况下,您需要做的就是将"$tmp"重定向到您的邮件命令,同时将-M "text/html"指定为一个选项,例如将上面的最后一行更改为:

 mailx -M "text/html" -s "wizard df redir -M" david@nirvana < "$tmp"

使用s-nail/mailx会导致:

e-mail results of html by attachment

注意:,我必须从另一台计算机发送,例如Archlinux将s-nail打包为mailx,而OpenSuSE打包heirloom-mailx

对于像heirloom-mailx这样的其他软件包,看来附件是将mailx设置为Content-type基于扩展名的唯一方法。通过读取具有以下格式的语法的MIME类型文件来做到这一点:

 type/subtype      extension [extension . . .]

因此,在这种情况下,您似乎必须重写邮件标头,或者手动创建包含Content-type的邮件的正文,该邮件的正文部分类似于以下内容:

Content-Type: text/html; charset=us-ascii

(或您的charset应该是什么)

这就是为什么我建议,如果您不使用基于mail/mailx的{​​{1}},然后看看您的发行版是否提供s-nail软件包,或者甚至值得从中构建源并放入s-nail