Linux---shell正则表达式---grep

Linux—shell正则表达式—grep

一.什么是正则表达式

​ 正则表达式又称正规表达式、常规表达式。在代码中常简写为 regex、regexp 或 RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。

​ 正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。其中普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

​ 正则表达式一般用于脚本编程与文本编辑器中。很多文本处理器与程序设计语言均支持正则表达式,如前面提到的 Perl、Linux 系统中常见的文本处理器(grep、egrep、sed、awk)。正则表达式具备很强大的文本匹配功能,能够在文本海洋中快速高效地处理文本。

二.grep命令的各种用法

1.查找特定的字符,“-n”表示显示行号、“-i”表示不区分大小写,且符合标准的字符,字体颜色会变为红色,“-v”实现反向查找
[root@localhost ~]# grep -in 'zhangsan' /etc/passwd
43:zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
[root@localhost ~]# grep -vn 'nologin' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
41:roo:x:1000:1000:root:/home/roo:/bin/bash
43:zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
2.利用’[]'来查找集合字符
[root@localhost ~]# grep -n 'sh[io]rt' abc.txt
1:short
2:shirt
3."[^ ]" 实现集合字符的反向选择,如下查找“oo”前面不是“r”的字符串,|为且符号
[root@localhost ~]# grep -n '[^r|sh]oo' /etc/passwd
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
39:postfix:x:89:89::/var/spool/postfix:/sbin/nologin

4.不希望“oo”前面出现小写字母和大写字符以及数字,可以执行 “grep -n ‘[^a-zA-Z0-9]’ a.txt“

[root@localhost ~]# grep -n '[^a-zA-Z0-9]' abc.txt
4:_oodd
8:Ab.
9:cold.

5.行首符”^ “,放在[ ]之内表示取反,放在[ ]之外表示行首字符,如查询不以字母开头的行 ‘ [a-z]’

[root@localhost ~]# grep -n '^[^a-z]' abc.txt
4:_oodd
5:12
6:13
7:14
8:Ab.

6.定位行尾$

[root@localhost ~]# grep -n '\.$' abc.txt
8:Ab.
9:cold.
7.查询空白行时使用,“ grep -n ‘^$’ a.txt”
`[root@localhost ~]# grep -n '^$' abc.txt
5:`
8.用“.”查找任意一个字符,"."在正则表达式中的一个元字符,代表任意一个字符
[root@localhost ~]# grep -n 'w..d' abc.txt
11:wood
[root@localhost ~]# grep -n 'w.d' abc.txt
12:wod

9.“”代表的是重复零个或者多个前面的单个字符,“o”表示拥有零个或大于等于一个“o”的字符,因为允许空字符,所以执行”grep -n ‘o*’ a.txt“会将文本中所有内容都输出打印,”oo*“表示第一个o必须存在,第二个o则是零个或多个o;”ooo*“表示第一个和第二个o必须存在,第三o则是零个或多个

[root@localhost ~]# grep -n 'ooo*' abc.txt
4:_oodd
11:wood
13:woood
14:wooood
15:woooood

10.查询以w开头d结尾,中间的字符可有可无的字符串

[root@localhost ~]# grep -n 'w.*d' abc.txt
11:wood
12:wod
13:woood
14:wooood
15:woooood
16:wd

11.查询任意数字所在行

[root@localhost ~]# grep -n '[0-9][0-9]*' abc.txt
6:12
7:13
8:14

12.查找连续字符范围,“{}”可以限制一个范围内的重复的字符串,因为在shell中{}有特殊意义,所以使用“{}“字符时,需要利用转义字符”",将”{}”字符转换成普通字符

查询包含两个o字符的行
[root@localhost ~]# grep -n 'o\{2\}' abc.txt
4:_oodd
11:wood
13:woood
14:wooood
15:woooood

13.查询以w开头以d结尾,中间包含2~5个o的字符串;和包含5以上的o字符串

[root@localhost ~]# grep -n 'wo\{2,5\}d' abc.txt
11:wood
13:woood
14:wooood
15:woooood
[root@localhost ~]# grep -n 'wo\{5,\}d' abc.txt
15:woooood

三.元字符的总结

1.^ ,匹配输入字符串的开始位置。除非在方括号表达式中使用,表示取反。要匹配“^“字符本身,请使用“^”
2.$ ,匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则“KaTeX parse error: Undefined control sequence: \n at position 6: ”也匹配‘\̲n̲’或‘\r’。要匹配“”字符本身,请使用“$”
3. ‘.’,匹配除“\r\n”之外的任何单个字符
4.\ ,将下一个字符标记为特殊字符、原义字符、向后引用、八进制转义符。例如,‘n’匹配字符“n”。 ‘\n’匹配换行符。序列‘\’匹配“\”,而‘(’则匹配“(”
5.* , 匹配前面的子表达式零次或多次。要匹配“*”字符,请使用“*”
6.[] ,字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”
7.[n1,n2],字符范围。匹配指定范围内的任意一个字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意一个小写字母字符。注意:只有连字符(-)在字符组内部,并且出现在两个字符之间时,才能表示字符的范围;如果出现在字符组的开头,则只能表示连字符本身
8.{n1},n 是一个非负整数,匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个 o
9.{n,},n 是一个非负整数,至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有 o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”
10.{n,m},m 和n 均为非负整数,其中 n<=m,最少匹配 n 次且最多匹配 m 次

你可能感兴趣的:(LINUX)