从HTML文档中提取IP地址

时间:2016-03-19 12:25:07

标签: html web-scraping wget

如何打印以下行的IP地址(86.23.215.130)?整个文件(未显示)是来自wget的标准输出(因此是HTML)。听起来很简单,但我没有管理。

...
<tr><td align=center colspan=3 bgcolor="D0D0D0"><font face="Arial, Monospace" size=+3>86.23.215.130</font></td></tr>
...

由于

4 个答案:

答案 0 :(得分:4)

为何选择?我相信grep要好得多:

grep -iohP '(?<=\x3e)([0-9]+\.){3}[0-9]+(?=\x3c)' file

其中\ x3e表示&gt;和\ x3c表示&lt; (ascii十六进制代码)

虽然sed可以做到这一点,但不建议这样做:

sed -rn 's/.*\x3e(([0-9]+\.){3}[0-9]+)\x3c.*/\1/p' file

感谢Sternad先生,我对此有所改进。

答案 1 :(得分:3)

如果只想提取IP地址,则应使用以下命令:

sed -E -n 's/.*>([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)<.*/\1/p' file.txt

这是它的作用:

  • -E切换到扩展正则表达式模式(GNU Sed中的-r)
  • -n会抑制匹配行的输出
  • 's/something/something2/p'用something2替换某些东西并打印出结果匹配
  • ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)捕获一组四个连续数字,以点分隔
  • \ 1是对上面捕获的组的引用

请注意,此正则表达式不一定能找到正确的IP地址,而是以点分隔的任何数字序列。

如果您想要更高的灵活性(和准确性),可以使用Perl Commons Regex module。它验证IP地址。

perl -MRegexp::Common -lne 'print $1 if /($RE{net}{IPv4})/' file.txt

请注意,您必须正确锚定表达式,否则486.23.215.130之类的无效IP将缩减为有效地址86.23.215.130

答案 2 :(得分:2)

IP地址是由3个周期点分隔的4组0-3位数。

sed -e '/[0-9]\.[0-9]\.[0-9]\.[0-9]/p' infile.txt

答案 3 :(得分:0)

这个怎么样? 有何评论?

grep "size=+3" | awk -F'[<>]' '{print $7}'

我知道......它假设IP始终位于包含size+3的行中的相同位置。您的建议更为普遍,因此更适用于任何解析输入文本。