使用 BASH 命令连接文件每一行的一部分
Concatenating a portion of each line of a file using BASH commands
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 地址都可以点击 hyperlink。
我已经成功使用以下操作:
第 1 步 - 在每行前面加上 HTML hyperlinks.
的开头部分
使用的代码(成功):sed -e 's/^/<a href=\"http:\/\//' -i /var/www/html/fail2ban.html
第 2 步 - 在每一行后附加 HTML hyperlinks 的结束部分和一个换行符。
使用的代码(成功):sed -e 's/$/\">CLICK HERE<\/a><\/br>/' -i /var/www/html/fail2ban.html
结果 - 整个 HTML 文件现在包含一个 link 列表,如下所示:
<a href="http://10.30.20.40">CLICK HERE</a></br>
问题 - 而不是 "CLICK HERE" 作为 link 文本,我想显示相应的 IP 地址。使用上述示例的期望结果示例:
<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>
您可以使用单个 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>
备注:
^.*$
完全匹配任何行
- 替换中的
&
是指整行文本匹配.*
- 使用
,
字符代替 /
以避免在正则表达式和替换模式中过度转义 /
字符。
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 地址都可以点击 hyperlink。 我已经成功使用以下操作:
第 1 步 - 在每行前面加上 HTML hyperlinks.
的开头部分使用的代码(成功):sed -e 's/^/<a href=\"http:\/\//' -i /var/www/html/fail2ban.html
第 2 步 - 在每一行后附加 HTML hyperlinks 的结束部分和一个换行符。
使用的代码(成功):sed -e 's/$/\">CLICK HERE<\/a><\/br>/' -i /var/www/html/fail2ban.html
结果 - 整个 HTML 文件现在包含一个 link 列表,如下所示:
<a href="http://10.30.20.40">CLICK HERE</a></br>
问题 - 而不是 "CLICK HERE" 作为 link 文本,我想显示相应的 IP 地址。使用上述示例的期望结果示例:
<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>
您可以使用单个 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>
备注:
^.*$
完全匹配任何行- 替换中的
&
是指整行文本匹配.*
- 使用
,
字符代替/
以避免在正则表达式和替换模式中过度转义/
字符。