このスクリプトを使用して、テキストファイルからコマンドラインを抽出し、表形式で電子メールで送信します。単一のコマンドに複数行の出力があるため、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コマンドを次のように変更しました
print
。printf
- 2 番目の awk コマンドでは、
for
ループを使用して各 IP アドレスを繰り返し実行し、各 IP アドレスをスペースで区切って 1 行に印刷します。 - 結果がテーブルに正しくソートされるように、入力ファイルの行3から17から余分なスペースを削除しました。