我有一个包含不同行的文件,其中我有一些行
173.194.034.006.00080-138.096.201.072.49934
模式是 3 个数字,然后是一个点,然后是 3 个数字,然后是一个点,等等。
为此,我想使用 awk、grep 或 sed。我如何表达这个正则表达式?
在 awk 中,我可能会构建字符串,然后将其搜索为:
BEGIN {
p = "[.]"
d = "[[:digit:]]"
d3 = d d d # or d"{3}"
d5 = d d d d d # or d"{5}"
re = d3 p d3 p d3 p d3 p d5 # or "(" d3 p "){4}" d5
}
$0 ~ re "-" re
但这真的完全取决于你想用它做什么。
假设您想获得 123 等 1 个系列的行。存在,请执行
grep '[0-9][0-9][0-9]\.' file > numbersFile
如果你想要像 123.345 这样的 2 个系列,那就做
grep '[0-9][0-9][0-9]\.[0-9][0-9][0-9]\.' file > numbersFile
等等等等
每种[0-9]
方法仅匹配 0-9 (0,1,2,3,4,5,6,7,8,9) 范围内出现的一个字符。
因为'.' char 在普通的 grep 正则表达式中具有特殊含义,您可以逃避它,就像\.
表示“只需匹配 '。” 字符(仅限!);-)
grep 有一些花哨的扩展,允许您指定一次模式,并包括一个限定符,如{3}
or 有时\{3\}
(表示 3 次重复)。但是这个扩展不能移植到 Solaris、AIX 等旧的 Unix 上。
这是一个简单的测试,看看您的系统是否支持限定符。(欢迎超级 Grep-heads 更正我的术语 :-)。
echo "173.194.034.006.00080-138.096.201.072.49934" | grep '[0-9]\{10\}\.'
echo "173.194.034.006.00080-138.096.201.072.49934" | grep '[0-9]\{2\}\.'
第一个测试应该失败,如果你的 grep 支持限定符,第二个测试会成功。
学习长期解决方案(如上)并没有什么坏处,您可以确定这适用于任何 grep。
IHTH。
从外观上看,这些是 IP 地址,然后是端口号、破折号,然后是 IP 地址/端口号组合。
如果您使用的是现代 UNIX/Linux 系统,那么
grep -P '(\d{3}\.){4}\d{5}-(\d{3}\.){4}\d{5})'
会做的伎俩 - 虽然可能不是最便携的方式来做到这一点。这使用“-P”表示“使用 Perl 正则表达式”选项,有些人可能认为这是作弊!
你没有说在这些字符串之前或之后是否有额外的文本。如果有,那么您可以使用“-o”选项来提取匹配的文本并忽略其他所有内容。