通配符(wildcard)
最常用的通配符包括:?、*、[]、{}、^等,通配符与正则表达式中的元字符意义不完全相同
* 匹配0个或者多个字符
? 匹配1个字符
[...]匹配范围内任意1个字符[az]、[a-z]、[az)-]
[^...]匹配范围外任意1个字符,表示取反,[^0-9]
{} 组合匹配,touch a{1,3,5} touch {1..10}

shell里的 ? 通配任意一个字符
          * 代表任意一个任意字符

shell里称为通配符:?,*,[],{},^,$,!
正则表达式为元字符 有特殊作用的字符,能描述其他字符的字符

一些特殊符号+字符+数字组合成一个表达式,用来表示某个意思、特定含义
使用一些特殊符号+字母和数字按照某个规则组合成一个公式用来表示某个意思这就叫正则表达式

正则表达式 regular expression
regular 常规的 正则  expression 表达式 公式
按照某种正常的规则表达出某个含义(意思)的公式
正则表达式里规定很多特殊符号有特殊的含义和作用
正则表达式是一种方法,
很多命令可以采用这种方法,例如vim、grep、sed、awk等命令都支持正则表达式。

元字符
| 在grep的正则里表示或者
^ 表示以什么开头
$ 表示以什么结尾
? 表示前面的字符出现0或者1次
+ 表示前面的字符出现1次以上
* 表示前面的字符出现0次或无数次
. 表示任意单个字符
{n} 表示前面的字符出现n次
[] 表示里面的任意一个字符
() 把里面的看做一个整体然后* + ?
\ 转义字符

什么是正则?
    使用一些特殊符号+字母和数字按照某个规则组合成一个公式用来表示某个意思这就叫正则表达式
    expression 表达式  、公式 --》一套方法,里面有特殊字符,字母,数字组合---》表达某个意思
        方法--》一个轮子
正则用在哪里?
    查找的场景特别适合使用正则
    vim 、grep、sed、awk等

egrep awk sed 和正则有什么联系呢?
    正则表达式里规定很多特殊符号有特殊的含义和作用
    正则表达式是一种方法,
    很多命令可以采用这种方法,例如vim、grep、sed、awk等命令都支持正则表达式。

grep通用正则表达式分析程序(global search regular expression and printing)
用途:使用正则表达式搜索文本,并把匹配的行打印出
格式:grep[选项]...模式 目标文件
-V:反转查找,输出与模式不相符的行
-An:同时显示符合条件行的下面n行
-Bn:同时显示符合条件行的上面n行
-Cn:同时显示符合条件行的上面n行
-E: 支持扩展正则表达式
-o: 仅显示匹配模式的字符串
-f:根据文件内容进行匹配

-n:输出行号
-i:不区分大小写 --ignore-case 
-o:只显示匹配内容 --only-match
-v:取反
-A:after 
-B:befor
-C:center context上下文
-r:递归查找
-E:扩展正则

grep 支持扩展正则一般使用egrep = grep -E
        1.基本正则
            元字符:* . ^ $ {}
        2.扩展正则
            元字符: | + ? 

正则表达式由下列元素构成
普通字符,a、b、1、2
通配符,与文件名通配符不是一回事
修饰符:”*”、”?”等
锚点:以什么开头、以什么结尾 \<  \>
^代表以什么开头的行
$代表以什么结尾的行
^$代表空行
.代表任意单个字符
.*表示什么意思?---》代表所有的字符(任意字符)
^huawei$以huawei开头并且以华为结尾,其实就是整行里只有一个huawei

[abc] 代表abc中取一个
a|b|c 也是代表abc中取一个    
还有[a-z]全部小写字母 包含小写字母的行
    [a-Z]大小写字母 包含字母的行
    [0-9]数字 v     包含数字的行
    [0-Z]数字和字母  包含数字和字母的行
    [^0-Z]不是数字和字母 不包含数字和字母的行
    ^[^0-9] 不是以数字开头的行

[^0-9]与 -v [0-9]的区别?
前一个是对单个字符取反而后一个是对整行取反
颗粒度的问题

相当于切片
{4} 表示前面一个字符出现4次
{4,6} 表示前面一个字符出现4-6次
{,5} 表示出现0-5次
{1,} 表示出现1-无限次

单词的定界符\<  \>  与 \b \b等同
\<san  有以san开头单词的行
\<sang\>  有独立单词sang的行

查找文本里单词的长度是12个字符的字符串
egrep \<[a-Z]{12}\>

查找文本里单词的长度是12-16个字符的字符串
egrep \<[a-Z]{12,16}\>

从文本过滤出所有邮箱地址
邮箱:特点:共性问题
格式:字符串1@字符串2.字符串3695811769@qq.com
fengdeyong123@163.com
fengdeyong_123@164.cn
字符串1:a-Z 0-9
字符串2: a-Z 0-9
字符串3: a-Z
-o [0-z_.]+@[0-z]+\.[a-z]+

sort|uniq
排序并去重

sort 排序:默认情况下根据一行的第一个字符的ASCLL码比较
如果第一个一样就比较第2个
选项 -n 根据数值比较
     -k 根据第几列比较
     -r 排序是降序
     -t 指定分隔符

uniq 去重,去除重复的行 unique 唯一
只能去除连续的重复的行所以要先排序后去重
选项 -c 统计行数

1.进入/lianxi目录,复制/etc/passwd到当前目录下,然后输出到屏幕.

```
[root@www lianxi]# cp /etc/passwd .
```

2、查找出当前passwd文件中以ftp或者mail开头的行,在屏幕上输出。

```
cat passwd |egrep "^ftp|^mail"
```

3、查找出当前passwd文件中首行不是以r、m、f开头的行,在屏幕上输出。

```
[root@www lianxi]# cat passwd |egrep -v "^r|^m|^f"
```

4、查找出当前passwd文件中以bash结尾的行。

```
[root@www lianxi]# cat passwd |egrep "bash$"
```

5、查找出/etc/login.defs文件中的有效行(不显示空行和注释行)。

```
[root@www lianxi]# cat /etc/login.defs |egrep -v "^$|^#"
```

6、查找出/var/log/messages文档中有16个字母的单词

```
[root@www lianxi]# cat /var/log/messages |egrep "\b[a-Z]{16}\b"
```

7、查找出来/etc/passwd文件里用户名包含liu同时使用bash的用户

```
[root@www lianxi]# cat passwd |egrep "bash$"|egrep "liu"
```

8、查找/etc/ssh/sshd_config 里的有效行

```
[root@www lianxi]# cat /etc/ssh/sshd_config |egrep -v "^#|^$"
```

9、查找出/etc/ssh/sshd_config 文件里的包含连续2个数字的行

```
[root@www lianxi]# cat /etc/ssh/sshd_config |egrep "[1-9]{2}"
```

10、查找出/etc/ssh/sshd_config包含特殊字符的行

```
[root@www lianxi]# cat /etc/ssh/sshd_config |egrep [^0
```

11、查找出/etc/ssh/sshd_config不包含数字的行

```
[root@www lianxi]# cat /etc/ssh/sshd_config |egrep -v [0-9]
```

成都14、写一个表示下面网址的正则表达式出来。例如:

http://www.baidu.com fjdkfjdkfj
http://www.sina.com fengdeyong
http://www.163.com http://www.12306.cn 1212121
http://www.qillu.edu sanchuang
www.github.com/abc
ftp://192.168.0.1
!ftp://www.baidu.com 12112

```
[root@www lianxi]# cat netadtr.txt |egrep "[a-z]+://[0-Z]+\.[0-z]+\.[0-z/]+(\.[0-9])?" -o
```

15.时间的正则

    时间的正则,表示18/Dec/2021:16:54分钟到18/Dec/2021:16:58分钟

```
[root@www lianxi]# egrep 18/Dec/2021:16:5[4-8]
```

简单的ip地址的正则
[root@nginx-kafka01 lianxi]# egrep "\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}\>" ip.txt 
24.52.242.52
42.35.56.43
242.34.52.66