首页 文章

无法通过shell [重复]以表格格式输出

提问于
浏览
0

这个问题在这里已有答案:

以下是代码 . 我没有以表格格式获得输出 . 有人可以帮忙吗?

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

In email receiving output like below.

<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 回答

  • 1

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

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

    (鉴于您的 mail 可能是 snailBerkeley mailxheirloom_mailx - 所有这些都来自Berkeley邮件的各种迭代,其中包含最新的,当前维护的版本s-nail 14.9.11-1 (Homepage)

    如果 mail 是提供 -a (attach)选项的派生之一,那么可能就是这样 . 虽然您的电子邮件正文仍然是 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 的路径)

    除了调整之外,上面提到的唯一变化是"attach"将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 . 对于一个小包,这两个实现提供了强大的命令行邮件功能)

    Edit Per-Request to Encode as "text/html" in Body of Message

    这里有很多将取决于你有哪些 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 会导致:

    note: 我必须从另一台机器发送,例如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 应该是什么)

    这就是为什么我建议,如果你没有使用基于 s-nailmail/mailx ,那么去看看你的发行版是否提供了 s-nail 包,否则它甚至值得从源码构建并放入 /usr/local/bin .

相关问题