正则,通配符区别以及命令支持情况
- 正则用来匹配字符串
- 通配符用来匹配文件名
- 文本三剑客,可以在文件中搜索字符串,支持正则表达式 grep awk sed
- ls find cp 默认支持通配符,不支持正则表达式
测试文档
[root@214 yum.repos.d]# cat 1.txt
123af
qaaac
Zwead
Za21312qwea
sdas
aaaa
aa
333qqqqaaa
1. * 的使用方法
- a表示 前面的a重复0次或多次
没有限位符时,aa和a是一个作用,表示匹配一个a
grep “a” 1.txt = grep “aa“ 1.txt
- 在通配符中 * 表示匹配任意内容
- 当有特定限位符时,限位符指的是 要查找的字符串的内容两边都有内容
```shell
至少显示2个aa的字
[root@214 yum.repos.d]# grep “aaa*” 1.txt qaaac aaaa aa 333qqqqaaaaaaaaaaaa
<a name="S4WsA"></a>
#### 2 . . 的使用方法,匹配任意字符
1. grep "s..d" 1.txt 在 1.txt中搜索 s开头 d结尾,任意中间内容的字符串
1. grep ".*" 1.txt 表示匹配所有内容,也就是输出文档所有内容,没有什么意义,多一种查看文档的方式
```shell
[root@214 yum.repos.d]# grep ".*" 1.txt
123af
qaaac
Zwead
Za21312qwea
sdas
aaaa
aa
a
333qqqqaaaaaaaaaaaa
3. 匹配开头 ^
- hello^ 匹配以hello开头的行
- 如果是普通符号开头,区分大小写
```shell
匹配以Z开头的字符串
[root@214 yum.repos.d]# grep “^Z” 1.txt Zwead Za21312qwea
匹配以d为结尾的字符串
[root@214 yum.repos.d]# grep “d$” 1.txt Zwead
<a name="dvQ1r"></a>
#### 4.匹配结尾 $
1. hello$ 匹配以hello字符串结尾的行
```shell
#匹配以d为结尾的字符串
[root@214 yum.repos.d]# grep "d$" 1.txt
Zwead
- .$ grep “.$” 1.txt 匹配以任意字符的结尾,和匹配任意字符grep “.*”作用一样,但实际意义不同 ```shell [root@214 yum.repos.d]# grep “.$” 1.txt 123af qaaac Zwead Za21312qwea sdas aaaa aa a 333qqqqaaaaaaaaaaaa
这样也是没有意义的, 匹配任意以任意字符为开头,或结尾,或任意多个任意字符
```shell
[root@214 yum.repos.d]# grep "^.*$" 1.txt
123af
qaaac
Zwead
Za21312qwea
sdas
aaaa
aa
a
333qqqqaaaaaaaaaaaa
- .$ 匹配以点结尾的行 , \ 把点的作用去掉了,把 . 变成了字符串的含义
- 如果是普通符号结尾,区分大小写 grep “n$” 1.txt
5.匹配空行
- grep -n “^$” 1.txt 行首和行尾之间什么都没有,就是空行
- 把除了空白行之外的显示出来 grep -v “^$” 1.txt -v就是取反
- 将passwd中的内容过滤掉root用户的信息,再过滤出普通用户的信息,因为只有 root和普通用户会用到 bin/bash的环境变量
这个注意点就是 grep的内容一次不够可以多次
grep -v "root" /etc/passwd | grep "bin/bash"
6.中括号的使用
grep “s[cqd]b” 1.txt 匹配中括号任意一个字符的字符串 scb,sdb,sqb
- grep “[0-9]” 1.txt 匹配中括号任意一个数字
- grep “[A-Z]” 1.txt 匹配中括号任意一个大写字母
- grep “^[a-z]b” 1.txt 匹配用小写字母开头的行
7.在中括号内使用^ 符号,表示取反
- grep “^[^0-9]” 1.txt 匹配以非数字开头的行
- grep “^[^z-aA-Z]” 1.txt 匹配不以字母开头的行
8. {n} {n,} {n,m} 用法 这个需要案例证明练习
这个三个 过滤器的 \ 只有在grep的时候需要加,如果是grep -E用法 两个 \都不需要加
{n}
a\{3\} 表示匹配包含3个a的内容 = aaaa*, 因为这里的a\{3\} ,前后都没有用到限位符<br />没有限位符 结果就会 有 aaa,aaaa,12312aaa,123123aaaatttt,aaaaa,会包含显示
[0-9]{4} 匹配4位数字
匹配手机号
[root@node1 ~]# vi 3.txt
13945671234
12345567890
[root@node1 ~]# grep -E "^[1]([3-9])[0-9]{9}" 3.txt
13945671234
^[0-9]{3}[a-z] 匹配 以三个数字为开头,后面是任意个数字母的内容。
- {n,} 表示前面的字符出现不小于n次
[0-9]{2,} 表示匹配2位及以上的数字
^[0-9]{3,}[a-z] 匹配 至少有三个数字为开头的内容,后面是任意个数字母的内容。
[su]a{3,}[il] 匹配 前面是s或u,中间至少三个a,后面是i或者l的内容
{n,m} 表示 前面的字符至少出现n次,最多出现m次
[a-z]{6,8} 匹配6-8位的小写字母
9.扩展正则 要使用grep -E 命令 或者egrep “字符串内容”
- +表示前一个字符匹配1次或者任意多次
go+gle 匹配gogle google gooogle
? 前一个字符匹配0次或者1次,多个a找不到
*表示前一个字符0次或者任意多次
grep -E “sa*id” test 会打印出 said ,sid ,saaaid 的内容。
- | 和()
- | 是或的作用
- 小括号会把括号中的内容当做一个整体
(dog)+会匹配dog dogdog dogdogdog
grep -E hello(world|earth)” 表示匹配 hello world或者hello earth
10.用正则匹配ip
分析:
这个写法匹配不了,还很复杂,不能用。看下面的简单写法
https://www.cnblogs.com/shengulong/p/8250693.html 这个可以过滤ip格式的数字段,但不能精确过滤符合规则的ip
11.正则匹配ip的简单写法
^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).
([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).
([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).
([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$