字符串模式和正则表达式

时间:2012-10-31 17:29:08

标签: regex sed awk grep

我有一个不同行的文件,其中有一些像

这样的行
173.194.034.006.00080-138.096.201.072.49934

模式是3个数字,然后是一个点,然后是3个数字,然后是一个点等

我想为此目的使用awk,grep或sed。我该如何表达这个正则表达式?

3 个答案:

答案 0 :(得分:1)

假设你想要获得像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,5,5,7,8,9)范围内的一个字符出现。

因为'。' char在普通的grep regexp中有一个特殊的含义,你可以像\.一样逃避它,以表示“只匹配'。' char(仅限!); - )

grep有花哨的扩展,允许您指定模式一次,并包含{3}或有时\{3\}等限定符(表示3次重复)。但是这个扩展不能移植到旧的Unix,如Solaris,AIX等。

这是一个简单的测试,看看你的系统是否支持限定符。 (欢迎Super 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。

答案 1 :(得分:1)

在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

但这完全取决于你想用它做什么。

答案 2 :(得分:0)

通过它看,这些是IP地址,然后是端口号,破折号,然后是IP地址/端口号组合。

如果您使用的是现代UNIX / Linux系统,那么

grep -P '(\d{3}\.){4}\d{5}-(\d{3}\.){4}\d{5})'

会做到这一点 - 虽然可能不是最便携的方式。这使用'-P'表示“使用Perl正则表达式”选项,有些人可能认为这是作弊!

您没有说明在这些字符串之前或之后是否有额外的文字。如果你有,那么你可以使用'-o'选项来提取匹配的文本并忽略其他所有内容。