使用 awk 从 txt 文件中提取多行并将其放入 html 中的单个单元格

使用 awk 从 txt 文件中提取多行并将其放入 html 中的单个单元格

使用此脚本从文本文件中提取命令行并以表格格式发送到电子邮件。需要知道如何使用 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 行的多余空格。

相关内容