如何grep数字范围

时间:2015-12-16 22:41:08

标签: linux bash grep

在文本文件中我有以下条目:

10.1.0.10-15
10.1.0.20-25
10.1.0.30-35
10.1.0.40-45

我想打印10.1.0.10,15, 20, 25,30

cat file | grep 10.1.0.[1,2,3][0.5] -- prints 10,15,20,25,30, 35.

如何压制35?

我不想使用grep -v .35 ...只想打印特定的IP或#s。

3 个答案:

答案 0 :(得分:2)

您可以使用:

grep -E '10\.1\.0\.([12][05]|30)' file

然而,awk会更具可读性:

awk -F '[.-]' '$4%5 == 0 && $4 >= 10 && $4 <= 30' file
10.1.0.10-15
10.1.0.20-25
10.1.0.30-35

答案 1 :(得分:1)

请注意,不需要字符类中的,. - 事实上,它们匹配您不希望模式匹配的数据。此外,字符类外部的.匹配任何字符(数字,字母或.,如您所愿) - 您需要使用反斜杠转义它们,以便它们仅匹配实际. }。

此外,您正在犯Useless Use of cat(UUoC)错误; grep可以很好地从文件中读取。

至于做什么,可能会使用:

grep -E '10\.1\.0\.([12][05]|30)' file

这使用扩展正则表达式(以前用于egrep,现在为grep -E)。它还避免了点匹配任何字符。

答案 2 :(得分:0)

我不确定你想要的只是打印前两个IP,不包括35个。在这种情况下cat file | grep '10.1.0.[1-3]0.[15|25]'完成工作。

请记住,您可以使用|等条件表达式来帮助您。