详细格式:
perl -n -e 'print "$1 $2\n" if m/^
((?:\d+\.){3}\d+) # IPv4 address
(?:\.\d+)? # Optional port
\s+ # White space
(?:(?:\d+\.){4}) # IPv4 address plus dot
(\d+) # Port number
\s*$ # Optional white space
/x' perl.data
单线:
perl -ne 'print "$1 $2\n" if m/^((?:\d+\.){3}\d+)(?:\.\d+)? (?:(?:\d+\.){4})(\d+)\s*$/'
如果第二个条目有端口号,这只会打印任何内容;如果没有,则跳过该行。
如果您愿意,可以使 IP 地址和端口号识别对称(即使不会打印第二个 IP 地址):
perl -n -e 'print "$1 $4\n" if m/^ \s* # Optional white space
((?:\d+\.){3}\d+) # IPv4 address
(?:\.(\d+)) ? # Optional Port number
\s+ # White space
((?:\d+\.){3}\d+) # IPv4 address
(?:\.(\d+)) # Mandatory Port number
\s* $ # Optional white space
/x' perl.data
我用过\d+
“一个或多个数字”;对于IPv4点分十进制地址组件,可以做成\d{1,3}
“一到三位数”,端口号可以做成\d{1,5}
“一到五位数”。
如果你真的很注重细节,你甚至可以更精确地限制数字范围,但这可能不值得。这是正则表达式处理的一个共同特征;您可以制作出足以胜任手头工作的东西 - 不必处理恶意软件可能向您抛出的所有可能变化。你必须对要做什么做出判断。