正则表达式概述
使用单个字符来描述、匹配一系列符合某个语句规则的字符串,由普通字符与特殊字符组成,正则表达式广泛使用在脚本编程、文本编辑器中。
正则表达式简写为regex、regexp、RE。
再大多数语言当中正则表达式都被包括在两个正斜杠当中“/”
正则表达式有一个特点“贪婪匹配”:尽量匹配最长的
正则表达式分类
- 基础正则表达式
\ 转义字符。例如:“!”将逻辑否的!看做普通字符,\还可以折行
例子1:
[root@localhost ~]# ls -l /home \
> /tmp
例子2:
[root@localhost ~]# grep "b.*in" a.txt
12 bin 34
23 sb.*in 23
44 binary 49
23 binlog 23
[root@localhost ~]# grep "b\.\*in" a.txt
23 sb.*in 23
^ 匹配字符串开始的位置,以…为开头的
$ 匹配字符串结束的位置,以…为结尾的
^$ 表示空行,不是空格
例子:
[root@localhost ~]# cat a.txt
aa
aa bb aa
a b a
[root@localhost ~]# grep "^aa$" a.txt
aa
. 匹配任意字符串
* 匹配前面子表达式(字符)0次或者多次
例子:
[root@localhost ~]# grep "a 0*" a.txt
aa 0
aa 00
aa bb 0000 aa 00
a b a 000
.* 匹配任意字符串
[list] 匹配list列表中的一个字符,例如:[abc]、[a-z]、[a-zA-Z0-9]
例子:
[root@localhost ~]# ifconfig ens32 | grep "TX [pe]"
TX packets 1776 bytes 206946 (202.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[^list] 匹配任意非list表中的一个字符,例如:[^a-z]、[^0-9]、[^A-Z0-9]
例子:
[root@localhost ~]# ifconfig ens32 | grep "TX [a-f]"
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]# ifconfig ens32 | grep "TX [^a-f]"
TX packets 1814 bytes 210662 (205.7 KiB)
\{n\} 匹配前面子表达式n次
例子:
[root@localhost ~]# grep "a 0\{2\}" a.txt
aa 00
aa bb 0000 aa 00
a b a 000
\{n,\} 匹配前面子表达式至少n次
[root@localhost ~]# grep "a 0\{2,\}" a.txt
aa 00
aa bb 0000 aa 00
a b a 000
\{n,m\} 匹配前面子表达式最少n次,最大m次
\< 词首牟定:固定词首
\> 词未牟定:固定词尾
例子:
[root@localhost ~]# grep "\<a\>" a.txt
a b a 000
转义字符 |
意义 |
\a |
响铃(BEL) |
\b |
退格(BS),将当前位置移到前一列 |
\n |
换行(LF)将当前位置移到下一行的开头 |
\r |
回车(CR)将当前位置移动到本行开头 |
\t |
水平制表(HT)调到下一个TAB位置 |
\v |
垂直制表(VT) |
\ |
代表一个反斜杠字符“\” |
Linux常用的文本处理工具
- grep 匹配,查询(过滤)
- sed 编辑(增加,删除,修改)
- awk 文本格式化(字符串提取)
注意事项
- Linux中正则一般以行为单位处理文件
- alias grep=‘grep --color=auto’
- 注意字符集,LANG=C
通配符
正则表达式和我们命令行中使用的通配符是有本质区别的。
通配符一般是处理文件名的
ls -l .txt
:任意长度任意字符串,属于通配符。
?:单个任意字符串,属于通配符。
grep命令的参数:
-v 排除匹配的内容(取反)
-E 支持扩展正则表达式=egrep
[root@localhost ~]# grep -Ev "^$|#" /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
-i 忽略大小写
[root@localhost ~]# cat a.txt
aAAA
[root@localhost ~]# grep -i "a" a.txt
aAAA
[root@localhost ~]#
-o 只输出匹配的内容
[root@localhost ~]# grep -o "root" /etc/passwd
root
root
–color=auto 匹配的内容显示颜色(用的不多 alias查看别名)
-n 在行首显示行号
[root@localhost ~]# grep -n "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
43:admin:x:1000:1000:root:/home/admin:/bin/bash
-q 匹配内容不显示(静默输出,一般写脚本的时候用而不输出到屏幕)
-w 将过滤条件当成单词来匹配
[root@localhost ~]# grep -w "bin" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
admin:x:1000:1000:root:/home/admin:/bin/bash
[root@localhost ~]# grep "bin" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
-c 只输出匹配行的计数
[root@localhost ~]# grep -c "root" /etc/passwd
3