![使用 awk 从 txt 文件中提取多行并将其放入 html 中的单个单元格](https://linux22.com/image/218360/%E4%BD%BF%E7%94%A8%20awk%20%E4%BB%8E%20txt%20%E6%96%87%E4%BB%B6%E4%B8%AD%E6%8F%90%E5%8F%96%E5%A4%9A%E8%A1%8C%E5%B9%B6%E5%B0%86%E5%85%B6%E6%94%BE%E5%85%A5%20html%20%E4%B8%AD%E7%9A%84%E5%8D%95%E4%B8%AA%E5%8D%95%E5%85%83%E6%A0%BC.png)
使用此脚本从文本文件中提取命令行并以表格格式发送到电子邮件。需要知道如何使用 awk 将多行(因为单个命令有多行输出)放入单个单元格中。
使用的脚本:
tmpfile="/tmp/test.html"
input="/tmp/test.txt"
{
echo '<table border=1 cellspacing=0 cellpadding=3>'
awk 'NR==1 {print "<tr><td>Hostname</td><td>"$0"</td></tr>"}' "$input"
awk 'NR==2,NR==5 {print "<tr><td>IPAddress</td><td>"$0"</td></tr>"}' "$input"
awk 'NR==6{print "<tr><td>Date</td><td>"$0"</td></tr>"}' "$input"
echo '</table>'
} >"$tmpfile"
文本文件:cat /tmp/test.txt - 第 2 至 5 行包含单个命令的输出。
machinename.domain
ens00: flags=00
inet 00.00.00.00 netmask 00.00.00.0 broadcast
ether 00:00:00:00:00:00 txqueuelen 000 (Ethernet)
RX packets 97 bytes 61809
currentdate
以电子邮件表格格式排除
Hostname machinename.domain
IPAddress ens00: flags=00
inet 00.00.00.00 netmask 00.00.00.0 broadcast
ether 00:00:00:00:00:00 txqueuelen 000 (Ethernet)
RX packets 97 bytes 61809
Date currentdate
表格形式的电流输出
Hostname machinename.domain
IPAddress ens00: flags=00
IPAddress inet 00.00.00.00 netmask 00.00.00.0 broadcast
IPAddress ether 00:00:00:00:00:00 txqueuelen 000 (Ethernet)
IPAddress RX packets 97 bytes 61809
Date currentdate
答案1
这可能是您想要使用任何 awk 执行的操作:
$ cat tst.sh
#!/usr/bin/env bash
tmpfile='test.html'
input='test.txt'
awk '
BEGIN {
print "<table border=1 cellspacing=0 cellpadding=3>"
}
NR == 1 {
print "<tr><td>Hostname</td><td>" $0 "</td></tr>"
}
NR == 2 {
print "<tr><td valign=\"top\">IPAddress</td><td>" $0
}
(2 < NR) && (NR < 6) {
print "<br>" $0
}
NR == 6 {
print "</td></tr>"
print "<tr><td>Date</td><td>" $0 "</td></tr>"
}
END {
print "</table>"
}
' "$input" > "$tmpfile"
$ ./tst.sh
$ cat test.html
<table border=1 cellspacing=0 cellpadding=3>
<tr><td>Hostname</td><td>machinename.domain</td></tr>
<tr><td valign="top">IPAddress</td><td>ens00: flags=00
<br>inet 00.00.00.00 netmask 00.00.00.0 broadcast
<br>ether 00:00:00:00:00:00 txqueuelen 000 (Ethernet)
<br>RX packets 97 bytes 61809
</td></tr>
<tr><td>Date</td><td>currentdate</td></tr>
</table>
当由浏览器呈现时,该表将如下所示,我认为这就是您想要的:
答案2
awk ORS(输出记录分隔符)变量可用于将多行的输出合并到一个单元格中。您可以将其修改为任何其他字符串或字符;默认情况下,它设置为换行符。
您的脚本已更改为使用 awk 将第 3 行到第 17 行的输出合并到单个单元格中:
tmpfile="/tmp/test.html"
input="/tmp/test.txt"
{
echo '<table border=1 cellspacing=0 cellpadding=3>'
awk 'NR==1 {print "<tr><td>Hostname</td><td>"$0"</td></tr>"}' "$input"
awk 'NR==2,NR==5 {gsub(/^ */, ""); printf "<tr><td>IPAddress</td><td>"; for (j=1; j<=NF; j-=-1) {printf "%s ", $j}; printf "</td></tr>";}' "$input"
awk 'NR==6{print "<tr><td>Date</td><td>"$0"</td></tr>"}' "$input"
echo '</table>'
} >"$tmpfile"
我修改的内容如下:
- 我
gsub(/*, "")
在第二个 awk 命令中包含了删除输出行中任何前导空格的命令。这保证了输出在表中正确定位。 - 为了避免在每个IP地址后面插入换行符,我在第二个awk命令中更改
print
为。printf
- 在第二个 awk 命令中,我使用
for
循环重复运行每个 IP 地址并将每个 IP 地址打印在一行上,并用空格分隔。 - 为了确保结果在表中正确对齐,我消除了输入文件中第 3 行到第 17 行的多余空格。