正则,通配符区别以及命令支持情况

  1. 正则用来匹配字符串
  2. 通配符用来匹配文件名
  3. 文本三剑客,可以在文件中搜索字符串,支持正则表达式 grep awk sed
  4. ls find cp 默认支持通配符,不支持正则表达式

测试文档

  1. [root@214 yum.repos.d]# cat 1.txt
  2. 123af
  3. qaaac
  4. Zwead
  5. Za21312qwea
  6. sdas
  7. aaaa
  8. aa
  9. 333qqqqaaa

1. * 的使用方法

  1. a表示 前面的a重复0次或多次

没有限位符时,aa和a是一个作用,表示匹配一个a
grep “a” 1.txt = grep “aa
“ 1.txt

  1. 在通配符中 * 表示匹配任意内容
  2. 当有特定限位符时,限位符指的是 要查找的字符串的内容两边都有内容 ```shell

    至少显示2个aa的字

    [root@214 yum.repos.d]# grep “aaa*” 1.txt qaaac aaaa aa 333qqqqaaaaaaaaaaaa
  1. <a name="S4WsA"></a>
  2. #### 2 . . 的使用方法,匹配任意字符
  3. 1. grep "s..d" 1.txt 在 1.txt中搜索 s开头 d结尾,任意中间内容的字符串
  4. 1. grep ".*" 1.txt 表示匹配所有内容,也就是输出文档所有内容,没有什么意义,多一种查看文档的方式
  5. ```shell
  6. [root@214 yum.repos.d]# grep ".*" 1.txt
  7. 123af
  8. qaaac
  9. Zwead
  10. Za21312qwea
  11. sdas
  12. aaaa
  13. aa
  14. a
  15. 333qqqqaaaaaaaaaaaa

3. 匹配开头 ^

  1. hello^ 匹配以hello开头的行
  2. 如果是普通符号开头,区分大小写 ```shell

    匹配以Z开头的字符串

    [root@214 yum.repos.d]# grep “^Z” 1.txt Zwead Za21312qwea

匹配以d为结尾的字符串

[root@214 yum.repos.d]# grep “d$” 1.txt Zwead

  1. <a name="dvQ1r"></a>
  2. #### 4.匹配结尾 $
  3. 1. hello$ 匹配以hello字符串结尾的行
  4. ```shell
  5. #匹配以d为结尾的字符串
  6. [root@214 yum.repos.d]# grep "d$" 1.txt
  7. Zwead
  1. .$ grep “.$” 1.txt 匹配以任意字符的结尾,和匹配任意字符grep “.*”作用一样,但实际意义不同 ```shell [root@214 yum.repos.d]# grep “.$” 1.txt 123af qaaac Zwead Za21312qwea sdas aaaa aa a 333qqqqaaaaaaaaaaaa
  1. 这样也是没有意义的, 匹配任意以任意字符为开头,或结尾,或任意多个任意字符
  2. ```shell
  3. [root@214 yum.repos.d]# grep "^.*$" 1.txt
  4. 123af
  5. qaaac
  6. Zwead
  7. Za21312qwea
  8. sdas
  9. aaaa
  10. aa
  11. a
  12. 333qqqqaaaaaaaaaaaa
  1. .$ 匹配以点结尾的行 , \ 把点的作用去掉了,把 . 变成了字符串的含义
  2. 如果是普通符号结尾,区分大小写 grep “n$” 1.txt

5.匹配空行

  1. grep -n “^$” 1.txt 行首和行尾之间什么都没有,就是空行
  2. 把除了空白行之外的显示出来 grep -v “^$” 1.txt -v就是取反
  3. 将passwd中的内容过滤掉root用户的信息,再过滤出普通用户的信息,因为只有 root和普通用户会用到 bin/bash的环境变量
  4. 这个注意点就是 grep的内容一次不够可以多次

    1. grep -v "root" /etc/passwd | grep "bin/bash"

    6.中括号的使用

  5. grep “s[cqd]b” 1.txt 匹配中括号任意一个字符的字符串 scb,sdb,sqb

  6. grep “[0-9]” 1.txt 匹配中括号任意一个数字
  7. grep “[A-Z]” 1.txt 匹配中括号任意一个大写字母
  8. grep “^[a-z]b” 1.txt 匹配用小写字母开头的行

7.在中括号内使用^ 符号,表示取反

  1. grep “^[^0-9]” 1.txt 匹配以非数字开头的行
  2. grep “^[^z-aA-Z]” 1.txt 匹配不以字母开头的行

8. {n} {n,} {n,m} 用法 这个需要案例证明练习

这个三个 过滤器的 \ 只有在grep的时候需要加,如果是grep -E用法 两个 \都不需要加

  1. {n}

    1. a\{3\} 表示匹配包含3a的内容 = aaaa*, 因为这里的a\{3\} ,前后都没有用到限位符<br />没有限位符 结果就会 aaaaaaa12312aaa123123aaaattttaaaaa,会包含显示

[0-9]{4} 匹配4位数字
匹配手机号

  1. [root@node1 ~]# vi 3.txt
  2. 13945671234
  3. 12345567890
  4. [root@node1 ~]# grep -E "^[1]([3-9])[0-9]{9}" 3.txt
  5. 13945671234

^[0-9]{3}[a-z] 匹配 以三个数字为开头,后面是任意个数字母的内容。

  1. {n,} 表示前面的字符出现不小于n次

[0-9]{2,} 表示匹配2位及以上的数字
^[0-9]{3,}[a-z] 匹配 至少有三个数字为开头的内容,后面是任意个数字母的内容。
[su]a{3,}[il] 匹配 前面是s或u,中间至少三个a,后面是i或者l的内容

  1. {n,m} 表示 前面的字符至少出现n次,最多出现m次

    [a-z]{6,8} 匹配6-8位的小写字母

9.扩展正则 要使用grep -E 命令 或者egrep “字符串内容”

  1. +表示前一个字符匹配1次或者任意多次

go+gle 匹配gogle google gooogle

  1. ? 前一个字符匹配0次或者1次,多个a找不到

  2. *表示前一个字符0次或者任意多次

grep -E “sa*id” test 会打印出 said ,sid ,saaaid 的内容。

  1. | 和()
  2. | 是或的作用
  3. 小括号会把括号中的内容当做一个整体

(dog)+会匹配dog dogdog dogdogdog
grep -E hello(world|earth)” 表示匹配 hello world或者hello earth

10.用正则匹配ip

分析:
这个写法匹配不了,还很复杂,不能用。看下面的简单写法

image.png

https://www.cnblogs.com/shengulong/p/8250693.html 这个可以过滤ip格式的数字段,但不能精确过滤符合规则的ip

11.正则匹配ip的简单写法

  1. ^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).
  2. ([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).
  3. ([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).
  4. ([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$