テキストファイル出力をテーブルの電子メールに送信しますが、電子メール出力にはテキストファイルの行に基づくテーブルの重複行があります。

テキストファイル出力をテーブルの電子メールに送信しますが、電子メール出力にはテキストファイルの行に基づくテーブルの重複行があります。

以下で動作するのは、txtファイルをテーブルの電子メールに送信することです。電子メール出力には、txtファイル出力の行数に応じて重複したコマンドラインがあります。受信した電子メールの出力にテキストファイルと同じ数の繰り返し行があるのはなぜですか?また、出力にtxtファイルの2行目をどのように使用できますか?

次のように使用してください。

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

  • 入力の2行目のみを出力するには、NR==2awkコードブロック全体の条件として()を使用してください。

  • また、印刷ドアはあまり必要ありません。 1つで簡単にすることができます(読みやすく簡単に作成できます)。以下のスクリプトでは、$0print文だけが引用されていません。

  • シェルスクリプトでは、awkの前後のイニシャルを印刷できます<table></table>awkスクリプトでBEGINと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(または他の)スクリプトはしばしば「1行」と呼ばれることがありますが、これは1行にしか存在できないという意味ではありません。一重引用符で囲まれているので、改行を含めることができます。非常に長いコード行は、読んで理解することはほとんど不可能であり、これはコードのデバッグがほとんど不可能であることを意味します。

    経験則:各ステートメントの後に改行文字を追加します。

    awkスクリプトにはステートメントが1つしかないため、ここでは実際には関係ありませんが、次のことも実行する必要があります。インデントコードこれにより、各入れ子のブロックが少しずつインデントされます(タブまたはいくつかの空白ですが、一貫性がなければならず、それぞれの新しいインデントレベルは同じ量のインデントを追加する必要があります)。これにより、コードプロセスをより簡単に表示できます。

関連情報