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 Output Record Separator(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(/*, "")2番目のawkコマンドに、出力行の先行スペースを削除するコマンドを含めました。これにより、出力がテーブルに正しく配置されます。
  • 各IPアドレスの後に改行文字を挿入しないように、2番目のawkコマンドを次のように変更しましたprintprintf
  • 2 番目の awk コマンドでは、forループを使用して各 IP アドレスを繰り返し実行し、各 IP アドレスをスペースで区切って 1 行に印刷します。
  • 結果がテーブルに正しくソートされるように、入力ファイルの行3から17から余分なスペースを削除しました。

関連情報