Bash脚本没有提供所需的输出

时间:2018-01-27 03:20:29

标签: html regex bash

下面的我的bash脚本没有以HTML代码的形式提供所需的输出。

True

它给出的输出看起来像这样......

is

当我需要输出看起来像这样:

#!/bin/sh

if [ $# -eq 0 ]
then
echo "Usage : flog LOGFILE"
exit 1
fi

logfile=$1
sed -i 's/invalid/<UNKNOWN>/g' $logfile
grep "Failed password for" $logfile | cut -d" " -f4 | sort | uniq -c | sort -k1,1nr -k2,2 > templog
sed -i 's/</\$lt;/g;s/>/\&gt;/g;s/^/<br \/>/g;' templog

echo "<html>" > flog.html
echo "<body><h1>Failed Login Attempts Report as of `date` </h1>" >> flog.html
cat templog >> flog.html
echo "/body" >> flog.html
echo "</html>" >> flog.html
cat flog.html

任何人都可以帮助我吗?我需要改变什么?我知道这可能是一个形成不良的问题,但我给了他一个机会。

1 个答案:

答案 0 :(得分:2)

问题出在您的部分:

logfile=$1
sed 's/invalid/<UNKNOWN>/g' $logfile
grep "Failed password for" $logfile | cut -d" " -f4 | sort | uniq -c | sort -k1,1nr -k2,2 > templog
sed 's/</\$lt;/g;s/>/\&gt;/g;s/^/<br \/>/g;' templog

首先:使用引号。这可能不是您当前问题的根源,但它很可能在将来会出现问题。所以:

logfile="$1"

您的问题的主要问题可能是cut -d" " -f4,更具体地说是4。这选择了第四个字段,显然是时间。我可以建议它可能是5,但我不知道你的输入是什么样的。这肯定不是你在评论中回答的内容。

所以,它会建议:

uidfield=5
logfile="$1"
sed -i 's/invalid/<UNKNOWN>/g' "$logfile" |
  grep "Failed password for" |
  cut -d" " -f$uidfield |
  sort |
  uniq -c |
  sort -n |
  sed -i 's/</\&lt;/g;s/>/\&gt;/g;s/^/<br \/>/g;' > templog

并使用uidfield=5玩,直到找到正确的字段。

另一句话:在s/^/<br \/>/g中,g有点过头了,因为每行只有一行开头。