下面的工作是将 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 代码块的条件。另外,您不需要那么多打印语句 - 您可以将其简化(并使其更易于阅读和修改)到只有一个。请注意,在下面的脚本中,只有
$0
print 语句中的 未加引号。您可以在 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 脚本中只有一个语句,但您也应该缩进代码这样每个嵌套块都会缩进一点(一个制表符或几个空格,但应该保持一致,每个新的缩进级别都应该添加相同数量的缩进)——这使得更容易看到代码的流程。