将文本文件输出发送到表中的电子邮件,但电子邮件输出在表中基于文本文件行有重复行

将文本文件输出发送到表中的电子邮件,但电子邮件输出在表中基于文本文件行有重复行

下面的工作是将 txt 文件发送到表中的电子邮件。电子邮件输出具有基于 txt 文件输出中的行数的重复命令行。为什么接收电子邮件的输出具有与文本文件一样的重复行数?还如何使用 txt 文件中的第二行进行输出。

使用如下。

tmpfile="/tmp/tmp.html"
 input="/tmp/tmp.txt"
 awk 'BEGIN {print "<table>"}
 {print "<tr>";print "<td>Hostname</td>";print "<td>"NR==2{print $0}"</td>";print "</tr>"}
  END {print "</table>"}' "$input" >"$tmpfile"
Expected out in email (table):
Hostname    machineipaddress
Current out:
Hostname    NR==2{print $0}
Hostname    NR==2{print $0}
    
# cat /tmp/tmp.txt
machinename.domain
machineipaddress

答案1

  • 如果您只想输出第二行输入,则使用 ( NR==2) 作为整个 awk 代码块的条件。

  • 另外,您不需要那么多打印语句 - 您可以将其简化(并使其更易于阅读和修改)到只有一个。请注意,在下面的脚本中,只有$0print 语句中的 未加引号。

  • 您可以在 shell 脚本中打印 awk 之前和之后的首字母<table>and 。</table>在 awk 脚本中使用 BEGIN 和 END 块这样做没有任何问题,但由于它们只是简单的打印语句(即没有需要 awk 的处理 - BEGIN 通常用于为 awk 脚本设置初始变量和其他条件,并且 END 通常用于生成最终输出 - 例如脚本其余部分中所有处理的摘要或结果,或者只是总计或平均值),在 awk 之外执行它们更容易。更重要的是,它简化了 awk 脚本。

tmpfile='/tmp/tmp.html'
input='/tmp/tmp.txt'

{
  echo '<table>'
  awk 'NR==2 { print "<tr><td>Hostname</td><td>"$0"</td></tr>" }' "$input"
  echo '</table>'
} > "$tmpfile"

输出:

$ cat /tmp/tmp.html
<table>
<tr><td>Hostname</td><td>machineipaddress</td></tr>
</table>
  • 最后,在代码中添加换行符和缩进以使其可读。像这样的小 awk(或其他)脚本通常可能被称为“单行”,但这并不意味着它只能在一行上 - 它在单引号中,因此可以包含换行符。几乎不可能阅读和理解极长的代码行,这意味着几乎不可能调试它们。

    经验法则:在每个语句后添加换行符

    它在这里并不真正相关,因为 awk 脚本中只有一个语句,但您也应该缩进代码这样每个嵌套块都会缩进一点(一个制表符或几个空格,但应该保持一致,每个新的缩进级别都应该添加相同数量的缩进)——这使得更容易看到代码的流程。

相关内容