如何在grep中获取10-20范围内的数字

How to get number in range 10-20 in grep

我需要从此文件中提取以 10-20 范围内的数字开头的行,我尝试使用 grep "[10-20]" tmp_file.txt,但来自具有这种格式的文件

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.aa
12.bbb
13.cccc
14.ddddd
15.eeeeee
16.fffffff
17.gggggggg
18.hhhhhhhhh
19.iiiiiiiiii
20.jjjjjjjjjjj
21.

它返回所有内容并标记每个包含 1、0、10、2、0、20 或 21 的数字:/

使用扩展正则表达式 (-E):

grep -E '^(1[0-9]|20)\.' file

输出:

10.aa
12.bbb
13.cccc
14.ddddd
15.eeeeee
16.fffffff
17.gggggggg
18.hhhhhhhhh
19.iiiiiiiiii
20.jjjjjjjjjjj

参见:The Stack Overflow Regular Expressions FAQ

另一个用awk

awk '/^10\./,/^20\./' tmp_file.txt

awk '/^10\./,/^13\./' tmp_file.txt
10.aa
12.bbb
13.cccc

尝试

grep -w -e '^1[[:digit:]]' -e '^20' tmp_file.txt
  • -w 强制匹配整个单词。这会阻止像 100... 这样的匹配行。它不是 POSIX,但现在大多数人遇到的每个 grep 都支持它。如果您担心便携性,请使用 grep -e '^1[[:digit:]]\.' -e '^20\.' ...
  • 可以多次使用-e选项来指定多个模式。
  • [[:digit:]]可能比[0-9]更可靠。参见 In grep command, can I change [:digit:] to [0-9]?

grep 不是用于此的工具,因为 grep 查找文本模式,但不理解数值。制作与 10-20 中的 11 个值匹配的图案就像用螺丝刀搅拌一罐油漆。你可以做到,但它不是完成这项工作的正确工具。

更清晰的方法是使用 Perl:

$ perl -n -e'print if /^(\d+)/ &&  >= 10 &&  <= 20' foo.txt

这表示如果行的开头 ^ 匹配一个或多个数字 \d+ 并且如果匹配的数值 是介于 10 和 20 之间。

假设文件可能未排序并使用数字比较

awk -F. ' >= 10 &&  <= 20' < file.txt