如何打印以下行的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>
...
由于
答案 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]+)
捕获一组四个连续数字,以点分隔请注意,此正则表达式不一定能找到正确的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
的行中的相同位置。您的建议更为普遍,因此更适用于任何解析输入文本。