【问题标题】:Unable to get output in table format through shell [duplicate]无法通过外壳获得表格格式的输出[重复]
【发布时间】:2018-12-09 14:57:38
【问题描述】:

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

#!/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> 

【问题讨论】:

  • @davis herring.. 抱歉打错了
  • 这就是关闭这个与某些mailx 的新功能相关的问题的问题,这些新功能在任何重复的问题中都没有提到。将其作为 dup 关闭将防止任何先前问题的访问者了解到 s-nail 当前 Heirloom-mailx 的实现包含 -M 选项,允许用户为正文指定 Content-type(例如 "text/html") -从stdin 重定向的文本。 s-nail 是现代 Linux 系统上伪装成 mailx 的所有软件包中最活跃/最新的。

标签: shell email


【解决方案1】:

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

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

(假设您的mail 可能是snailBerkeley mailxheirloom_mailx——所有这些都源自伯克利邮件的各种迭代以及当前维护的最新版本s-nail 14.9.11-1 (Homepage)

如果您的mail 是提供-a(附加)选项的派生之一,那可能就是要走的路。虽然您的电子邮件正文仍为Content-Type: text/plain,但您的附件将以Content-Type: text/html 的形式出现,大多数邮件阅读器将显示在电子邮件本身中(这似乎是您的目标)。

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

例如,包括调整,您可以这样做:

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 信息的表格输出,例如

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

编辑每个请求以在消息正文中编码为"text/html"

这很大程度上取决于您拥有的mail/mailx/s-nail 包。对于s-nail(通常也别名为mailx),-M 选项允许您为电子邮件正文在stdin 上接收的文本指定Content-type。在这种情况下,您只需将"$tmp" 重定向到您的邮件命令,同时指定-M "text/html" 作为选项,例如将上面的最后一行更改为:

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

使用s-nail/mailx 会导致:

注意:我必须从另一台机器发送,例如 Archlinux 包 s-nailmailx 而 OpenSuSE 包 heirloom-mailx

对于像heirloom-mailx 这样的其他软件包,附件似乎是让mailx 根据扩展名设置Content-type 的唯一方法。它通过读取具有以下格式的 MIME 类型文件来实现:

 type/subtype      extension [extension . . .]

因此,在这种情况下,您似乎必须重新编写邮件标题,或者手动创建邮件正文,包括邮件表格部分的Content-type,类似于:

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

(或者你的charset应该是什么)

这就是我建议的原因,如果你不使用基于s-nailmail/mailx,那么去看看你的发行版是否提供s-nail 包,或者它甚至值得从源代码构建并放入@987654381 @。

【讨论】:

  • 感谢您的帮助。我需要在电子邮件正文内容中输出。有可能吗?
  • 我确定这是可能的,我尝试将其转储到电子邮件正文中,但没有手动设置 Content-Type,您将只剩下 html 为普通/正文中的文字。具有讽刺意味的是,@cody 在他关于需要设置内容类型的回答中是正确的,但是您的mail -a 版本(幸运的是)正在寻找附件(这就是您收到文件未找到的原因)。如果您有s-nail,您可以使用-M 选项将stdin 的内容指定为text/html,如果没有该选项,则需要更多 - 您的mail 是什么?
  • mailx 版本 $ mailx -V 12.4 7/29/08
  • 是的,您遇到了附件或重写电子邮件标题以将内容类型从"text/plain" 更改为"text/html"。如果是我,我会下载当前的s-nail-14.9.11 source,然后将其构建并放入/usr/local/bin。如果您在系统上检查man mailx,我怀疑手册页以描述HEIRLOOM-MAILX 2010 结尾。 Opensuse 有 mailx-12.5-25 并且缺乏从 stdin 指定内容类型的任何能力。
  • 是的..你是对的......
猜你喜欢
  • 2012-01-11
  • 2012-03-10
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多