[root@localhost sec]# cat forst.txt
1 Two roads diverged in a yellow wood,
2 And sorry I could not travel both
3 And be one traveler, long I stood
4 And looked down one as far as I could
5 To where it bent in the undergrowth;
6
7 Excerpt from The Road Not Taken by Robert Frost
常见的命令选项
-c 计算与模式匹配的行数。
-E 启用扩展的正则表达式。
-f 从提供的文件中读取搜索模式。一个文件可以包含多个模式,每一行包含一个模式。
-i 忽略字符大小写。
-l 只打印匹配上模式的文件名和路径。
-n 打印匹配上模式的文件中的行号。
-P 启用 Perl 正则表达式引擎。
-R,-r 递归搜索子目录
[root@localhost sec]# grep 'T.o' frost.txt
1 Two roads diverged in a yellow wood,
# . 只匹配一个字符
[root@localhost sec]# egrep 'T.?o' frost.txt
1 Two roads diverged in a yellow wood,
5 To where it bent in the undergrowth;
# ? 只匹配 0或1 个字符
[root@localhost sec]# grep 'T.*o' frost.txt
1 Two roads diverged in a yellow wood,
5 To where it bent in the undergrowth;
7 Excerpt from The Road Not Taken by Robert Frost
# * 它匹配前面的项 0 次或多次
[root@localhost sec]# egrep 'T.+o' frost.txt
1 Two roads diverged in a yellow wood,
5 To where it bent in the undergrowth;
7 Excerpt from The Road Not Taken by Robert Frost
# + 加号(+)元字符与 * 相同,但它要求前一项至少出现一次。它匹配前一项一次或多次
可以用括号对字符分组。除此之外,还允许将括号内出现的字符视为一个单独的项,以便以后引用。下面是一个分组的例子:
$ egrep 'And be one (stranger|traveler), long I stood' frost.txt
And be one traveler, long I stood
在前面的示例中,我们使用圆括号和二元逻辑或运算符(|)创建了一个模式,该模式将与第 3 行匹配。第 3 行中有traveler这个单词,但是即使将traveler替换为stranger,这个模式也会匹配
示例 意义
[abc] 只匹配字符a、b或c
[1-5] 匹配 1 到 5 范围内的数字
[a-zA-Z] 匹配任何a到z的小写或大写
[0-9 +-*/] 匹配数字或加减乘除这四个数学符号
[0-9a-fA-F] 匹配一个十六进制数字
快捷方式 意义
\s 匹配空白字符
\S 匹配非空白字符
\d 匹配数字
\D 匹配非数字
\w 匹配字母、数字、下划线
\W 匹配非字母、数字、下划线
\x 匹配十六进制数(例如,0x5F)
快捷方式不支持 egrep。为了使用它们,你必须使用带有 -P 选项的grep。
字符类 意义
[:alnum:] 匹配任何字母和数字字符
[:alpha:] 匹配任何字母字符
[:cntrl:] 匹配任何控制字符
[:digit:] 匹配任何数字
[:graph:] 匹配任何图形字符
[:lower:] 匹配任何小写字符
[:print:] 匹配任何可打印的字符
[:punct:] 匹配任何标点符号
[:space:] 匹配任何空白字符
[:upper:] 匹配任何大写字符
[:xdigit:] 匹配任何十六进制数字
egrep '<([A-Za-z]*)>.*</\1>' tags.txt
在本例中,回调引用是出现在正则表达式后面部分的 \1。它引用了第一个圆括号集中包含的由两部分组成的表达式 [A-Za-z]。括号中的字母范围表示选择任何字母(大写或小写)。后面的 * 表示重复 0 次或多次。因此,\1 指括号中与该模式匹配的内容。如果 [A-Za-z] 匹配 div,那么 \1 也指模式 div。
因此,可以将整个正则表达式描述为:匹配“一个小于号(<)(正则表达式中的第一个字符),后面跟 0 个或多个字母,然后是大于号(>),接着是 0 个或多个任意字符(. 表示任意字符,* 表示 0 个或多个前一项),再之后是另一个 < 和一个斜杠(/),然后是括号内表达式匹配的字符串,最后是 > 字符”。如果这个正则表达式能够匹配文本文件中某一行的任何部分,那么 egrep 将打印该行。
在表达式中可以有多个反向引用,并根据其在正则表达式中的顺序使用 \1 或 \2 或 \3分别进行指定。\1 表示第一组圆括号,\2 表示第二组圆括号,依此类推。注意括号是元字符,有着特殊的含义。如果你只想匹配一个圆括号直接量,需要在它前面加上一个反斜杠,以规避它的特殊含义,如使用 sin\([0-9.]*\),以匹配 sin(6.2) 或sin(3.14159) 等表达式。
量词量词用于指定一个项必须出现在字符串中的次数。量词由大括号 {} 定义。
例如,模式T{5} 意味着字母T必须连续恰好出现 5 次。模式 T{3,6} 意味着字母T必须连续出现3 到 6 次。模式 T{5,} 意味着字母T必须出现 5 次或更多次
可以使用锚来指定模式必须存在于字符串的开头或结尾。补注号( ^ )用于将模式锚定到字符串的开头。例如,
^[1-5] 表示匹配的字符串必须以数字 1 到 5 中的一个数字开头。
$ 符号用于将模式锚定到字符串或行的末尾。
···
例如,
[1-5]$ 表示字符串必须以数字 1到 5 中的一个数字结尾。
此外,你还可以使用 \b 来标识单词边界(即一个空格)。
模式 \b[1-5]\b 将匹配从 1到 5 的任意一个独立出现的数字。
···