使用BASH命令连接文件每一行的一部分

时间:2018-10-03 11:47:47

标签: bash sed append concatenation prepend

正在使用的BASH版本:

echo $BASH_VERSION
4.4.19(1)-release

我正在使用以下管道从fail2ban日志文件中提取所有禁止的IP地址:

cat /var/www/html/fail2ban.log | grep Ban | cut -d "]" -f3 | cut -d "r" -f2 | cut -d "e" -f2 | cut -d " " -f3 | uq | sort -n > /var/www/html/fail2ban.html

这将导致一个HTML文件,其中IP地址的列表从低到高排序。

出于可用性考虑,我的目标是使每个IP地址都可单击超链接。 我已成功使用以下操作:


第1步-在每一行前都添加HTML超链接的开头。

使用的代码(成功):sed -e 's/^/<a href=\"http:\/\//' -i /var/www/html/fail2ban.html

第2步-在每行的末尾添加HTML超链接的结尾部分和一个换行符。

使用的代码(成功):sed -e 's/$/\">CLICK HERE<\/a><\/br>/' -i /var/www/html/fail2ban.html

结果-现在,整个HTML文件都包含一个链接列表,例如:

<a href="http://10.30.20.40">CLICK HERE</a></br>


问题-我想显示对应的IP地址,而不是“ CLICK HERE”作为链接文本。使用上面的示例获得所需结果的示例:

<a href="http://10.30.20.40">http://10.30.20.40</a></br>

如何使用sed,awk等完成最后一步?


来自文件 /var/www/html/fail2ban.html 的示例输入,该文件包含以下三行:

<a href="http://1.2.3.4">CLICK HERE</a></br>
<a href="http://5.6.7.8">CLICK HERE</a></br>
<a href="http://9.10.11.12">CLICK HERE</a></br>

所需的输出:

<a href="http://1.2.3.4">http://1.2.3.4</a></br> 
<a href="http://5.6.7.8">http://5.6.7.8</a></br>
<a href="http://9.10.11.12">http://9.10.11.12</a></br>

1 个答案:

答案 0 :(得分:0)

您可以使用单个sed命令:

sed -e 's,^.*$,<a href="http://&">&</a></br>,' -i /var/www/html/fail2ban.html

请参见online demo

s="10.23.34.23
56.67.22.12"
sed -e 's,^.*$,<a href="http://&">&</a></br>,' <<< "$s"

输出:

<a href="http://10.23.34.23">10.23.34.23</a></br>
<a href="http://56.67.22.12">56.67.22.12</a></br>

注意:

  • ^.*$完全匹配任何行
  • 替换中的&是指与.*匹配的完整行文本
  • 使用,字符代替/以避免在正则表达式和替换模式中过度使用/字符。