
システム上のユーザーの失敗したすべてのログインを含むログファイルをフォーマットする小さなスクリプトがあります。データを次の形式のテキストファイルに出力するスクリプトを作成しました(2つの列、1つ目は失敗したログイン試行の数、2つ目はユーザーです)。
1,325 Unknown
505 root
17 adm
16 ftp
etc...
この方法では、コンソールからHTML出力としてファイル形式を指定する必要があります(ファイルの各行はhtml改行文字で印刷されます)。
<html>
<body><h1>Failed Login Attempts</h1>
<br />1,325 Unknown
<br />505 Root
<br />17 adm
etc....
</body>
</html>
私が今やっていることは、ファイルを変数に保存してから、次のようにその変数をhtmlに入れることです。
file=$(cat finalo) #file name is finalo
#print to console
echo "
<html>
<body><h1>Failed Login Re...</h1>
<br />$file
</body>
</html>"
出力には、ファイル全体の内容が1行に表示されますhtml <br />
。私の質問は、ファイルの各行を各行に印刷するにはどうすればよいですか<br />
?
ファイル内の各特定の行を読み取り、変数に保存してから、次のように各行<br />
に変数を使用しようとします。
line1=$(sed -n '1p' < finalo)
line2=$(sed -n '2p' < finalo)
line3=$(sed -n '3p' < finalo)
そして:
<html>
<body><h1>Failed Login Report</h1>
<br />$line1
<br />$line2
<br />$line3
etc...
この回避策は正しい出力を提供しましたが、この回避策が汚れていることに加えて、ファイルにハードコードされた数字と異なる行数があると表示されないという大きな欠陥があります。
どんな助けでも大変感謝します!ところで、これは宿題です。
答え1
思ったより簡単です。
echo "
<html>
<body><h1>Failed Login Attempts</h1>"
# The following line prepends <br /> before each line in finalo
sed 's|^|<br />|' finalo
echo "
</body>
</html>"
答え2
また、使用することができますwhile
#!/bin/bash
echo "
<html>
<body><h1>Failed Login Attempt</h1>"
while read line
do
echo "<br />$line"
done < file
echo "</body>
</html>"
または関数を使用してください
function r_lines()
{
while read line
do
echo "<br />$line"
done < file
return $line
}
echo "
<html>
<body><h1>Failed Login Attempts</h1>
$(r_lines)
</body>
</html>"