1.1 正则符号
| 分类 | 命令 | |
|---|---|---|
| 基础正则 | ^ $ ^$ . * .* [a-z] [^abc] | grep/awk/sed |
| 扩展正则 | + | () {} ? | egrep/sed -r/awk |
1.2正则VS通配符
| 分类 | 用途 | 支持命令 |
|---|---|---|
| 正则 | 匹配字符,进行过滤 | awk、sed、grep等 |
| 通配符 | 匹配文件或文件名 *.txt *.log | Linux大部分命令都支持 |
1.3基础正则
$ cat -n test.txt
1 Jimmy the Weasel
2 100 Pleasant Drive
3 San Francisco,CA 123456
4
5 Big Tony
6 200 Incognito Ave.
7 Suburbia,WA 64890
| 基础正则 | |
|---|---|
| ^ | 以……开头的行 |
| $ | 以……结尾的行 |
| ^$ | 空行 |
| . | 表示任意一个字符 |
| .$ | 匹配出以.结尾的行 |
| * | 前一个字符连续出现0次或0次以上 |
| .* | 所有内容,任何内容,任意内容 |
| [] | [abc]1次匹配一个任意字符(a或b或c) |
1) ^ 以……开头的行

2) $ 以……结尾的行

3) ^$ 空行
- 空行这一行没有任何内容(空格属于字符)
-
匹配出空行
image.png - 应用
-
排除文件空行
image.png
-
4) . 表示任意一个字符
-
注意 不匹配空行
image.png
5) 匹配出以.结尾的行(转义字符\)

- 转义字符序列:
- \n 回车换行
- \t tab键
6) * 前一个字符连续出现0次或0次以上

-
* 的使用(前面字符出现0次或0次以上)当出现0次既相当于cat(grep '' test.txt)
image.png
7) .* 所有内容,任何内容,任意内容

-
注意正则表达式的贪婪匹配(尽可能的匹配更多)
image.png
8) [] [abc]1次匹配一个任意字符(a或b或c)

- ()小括号
- []中括号
- {}大括号
- [0-9]
- [a-z]
- [A-Z]
- [a-zA-Z0-9]
- [a-Z0-9]
- grep -i [a-z0-9] (-i参数不区分大小写)
- []中括号里面的内容一般会失去特殊含义
9) [^] [^abc]取反,排除 排除a或b或c的内容

10) 总结
| 基础正则 | 含义 | 搭配 |
|---|---|---|
| ^ | 以……开头的行 | |
| $ | 以……结尾的行 | |
| ^$ | 空行 | |
| . | 表示任意一个字符 | |
| * | 前一个字符连续出现0次或0次以上 | .* |
| \ | 转义字符 | \n \t |
| [] | 1次匹配一个任意字符 | [abc],匹配a或b或c;[]与+搭配 |
| ^ | 取反 | [^abc],排除a或b或c |
| 正则贪婪性 | 尽可能的匹配更多 |
1.4扩展正则
| 符号 |
|---|
| + |
| | |
| () |
| {} |
| ? |
1)+ 前一个字符连续出现1次或1次以上
-
注意 grep不支持扩展正则(egrep或grep -E使用扩展正则)
image.png
image.png -
匹配出文件中连续出现的数字
image.png
image.png -
匹配出文件中连续出现的字母
image.png

2)| 或者

| 符号 | 含义 | 应用场景 |
|---|---|---|
| [] | 1次匹配1个字符 | 匹配单个字符 [] 和 + |
| | | 匹配1个字符或多个 | 匹配整个单词 |
3)() 被括起来的内容,表示一个整体(一个字符) 反向引用(sed)

4){} 连续出现
| 符号 | 含义 |
|---|---|
| o{n,m} | 前一个字母o至少连续出现了n次,最多连续出现了m次 |
| o{n} | 前一个字母o连续出现了n次 |
| o{n,} | 前一个字母o至少连续出现了n次 |
| o{,m} | 前一个字母o至多连续出现了m次 |


5)?前一个字符出现0次或1次

6)扩展正则总结
| 扩展正则 | 含义 | 搭配 |
|---|---|---|
| + | 前一个字符连续出现1次或1次以上 | []+ |
| | | 或者 | |
| () | 被括起来的内容,表示一个整体(一个字符) 反向引用(sed) | |
| {} | 连续出现 | |
| ? | 前一个字符出现0次或1次 |
2. 三剑客
2.1 三剑客特点及应用场景
| 命令 | 场景 |
|---|---|
| grep | 过滤 |
| sed | 替换,修改文件内容,去行 |
| awk | 取列,统计计算 |
2.2 grep
| 选项 | 含义 |
|---|---|
| -E | ==egrep 支持扩展正则 |
| -A | after -A5 匹配你要的内容显示接下来的5行(包括本行) |
| -B | before -B5 匹配你要的内容显示上面的5行(包括本行) |
| -C | context -C5 匹配你要的内容显示上下的5行(包括本行) |
| -c | 统计出现了多少行,类似wc -l |
| -v | 取反、排除 按行为单位 |
| -n | 显示匹配内容,显示行数 |
| -i | 忽略大小写 |
| -w | 精确匹配 只匹配Tony不匹配Tonyjerk(\bTony\b,\b边界) |
2.3 sed
- 特点及格式
| 命令 | 选项 | 命令功能(g修饰符) | 文件名 |
|---|---|---|---|
| sed | -r(扩展正则) | 's#Little#Big#g' | test.txt |
| sed | -n(不加-n 默认输出) |
- 功能(增删改查)
| 命令 | 功能 |
|---|---|
| s | 替换 substitute sub |
| p | 显示 print |
| d | 删除 delete |
| cai | 增加 c/a/i |
sed命令执行过程
“找谁干啥”,要哪一行,增删改查sed核心应用
1)查找 p
| 查找格式 | 功能 |
|---|---|
| '1p' '2p' | 指定行号进行查找 |
| '1,5p' | 指定行号范围进行查找,'4,$p',4行到最后一行 |
| '/Tony/p' | 类似grep过滤 //里面可以写正则,显示包含Tony的行 |
| '/10:00/,/11:00/p' | 表示范围的过滤 '/San/,/200/p',显示包含San到200的行 |
| 1,/Tony/ | 混合(了解) 第一行到包含Tony的行 |
- 表示范围过滤,如果结尾的内容匹配不到就是一直显示到最后一行
2)删除 d(整行删除,删除字母用替换) 不用加-n
| 删除格式 | 功能 |
|---|---|
| '1d' '2d' | 指定行号进行删除 |
| '1,5d' | 指定行号范围进行删除,'4,$p',4行到最后一行 |
| '/Tony/d' | 类似grep过滤 //里面可以写正则,删除包含Tony的行 |
| '/10:00/,/11:00/d' | 表示范围的过滤 '/San/,/200/p',删除包含San到200的行 |
| 1,/Tony/ | 混合(了解) 第一行到包含Tony的行 |
- 删除空行或#行
egrep -v '^$|#' test.txT
sed -r '/^$/d' test.txt
sed -nr '/^$|#/!p' test.txt(!取反)
3)增加 cai
| 命令 | |
|---|---|
| c | replace 替代这行的内容 |
| a | append 追加,向指定的行或每一行追加内容(行后面) |
| i | insert 插入,向指定的行或每一行插入内容(行前面) |
4)替换 s
- g -> global 全局替换,sed默认只替换每行第一个匹配的内容
| 替换格式 |
|---|
| s###g |
| s///g |
| s@@@g |
- 反向引用
先保护再引用 sed -r 's#([0-9]+)#<\1>#g' test.txt

- \w [a-zA-Z0-9]

$ ip a s docker0|sed -n '3p'|sed -r 's#(^.t )(.)(/.*$)#\3#g'

$ ip a s docker0|sed -rn '3s#(^.t )(.)(/.*$)#\2#gp'

2.4 awk
- 行与列
| 名词 | awk中叫法 | 说明 |
|---|---|---|
| 行 | 记录 record | 每行默认通过回车分割 |
| 列 | 字段,域 field | 每列默认通过空格分割 |
- awk中行列结束标记都可以修改
1) 取行
| 常用的awk条件 | ||
|---|---|---|
| NR==1 | 取出某一行 | |
| NR>=1&&NR<=5 | 取出范围行 | |
| /2/,/4/ | 2到4行 | |
| /Tony/ | 过滤 | |
| 符号 | > < >= <= == != |
2) 取列
- -F 表示指定分隔符 指定每一列的结束标记,默认空格、连续空格和tap键
- $数字取出某一列,注意:在awk中$表示取出某一列
| 常用的awk条件 | ||
|---|---|---|
| NR==1 | 取出某一行 | |
| NR>=1&&NR<=5 | 取出范围行 | |
| /2/,/4/ | 2到4行 | |
| /Tony/ | 过滤 | |
| 符号 | > < >= <= == != |
awk 内置变量
| 内置变量 | ||
|---|---|---|
| NR | Number of Record 记录号,行号 | |
| NF | Number of Field 每行有多个字段 $NF表示最后一列 | |
| FS | -F === -v FS=;Field Separator 字段分隔符,每个字段结束标记 | |
| OFS | Output Field Separator 输出字段分隔符(默认空格) |
3)正则表达式
- //支持扩展正则
- awk可以精确到某一列,某一列中包含/不包含……内容。
- ~包含
- !~不包含
| 正则 | awk正则 | |
|---|---|---|
| ^ 表示以……开头的行 | 某一列的开头 $3~/^Tony/ | |
| $ 表示以……结尾的行 | 某一列的结尾 $3~/Tony$/ | |
| ^$ 表示空行 | 某一列空 |
- 特殊模式BEGIN{}和END{}
| 模式 | 含义 | 应用场景 |
|---|---|---|
| BEGIN{} | awk读取文件之前执行括号里的内容 | 1)进行简单统计,计算不涉及读取文件 2)处理文件之前加表头 3)用来定义awk变量(可以用-v) |
| END{} | awk读取文件之后执行括号里的内容 | 1)awk进行统计,一般过程:先进行计算,最后END里面输出结果 2)awk使用数组,用来输出数组结果 |
- END统计计算:
| 统计方法 | 简写形式 | 应用 |
|---|---|---|
| i++ | i=i+1 | 计数,统计次数 |
| sum=sum+??? | sum+=??? | 求和,累加 |
| array[]=array[]+1 | array[]++ | 数组分类计数 |
| 注意:i,sum都是变量 |
5)awk数组
| shell数组 | awk数组 | |
|---|---|---|
| 形式 | array[0]=Tony array[1]=Tom | array[0]=Tony array[1]=Tom |
| 使用 | echo ${array[0]} ${array[1]} | print array[0] array[1] |
| 批量输出数组内容 | for i in ${array[*]} do echo $i done |
for(i in array) print array[i] |
$ awk 'BEGIN{a[0]="Tony";a[1]="Tom";print a[0],a[1]}'
$ awk 'BEGIN{a[0]="Tony";a[1]="Tom";for(i in a)print a[i]}'
6)for循环
| shell编程c语言for循环 | awk for循环 | |
|---|---|---|
| for(i=1;i<=10;i++) do echo $i done |
for(i=1;i<=10:i++) print i |
awk for循环来循环每个字段 |
$ awk 'BEGIN{for(i=1;i<=100;i++)sum+=i;print sum}'
$ awk 'BEGIN{for(i=1;i<=100;i++){sum+=i;print sum}}'
7)if判断
| shell if判断 | awk if判断 | |
|---|---|---|
| if["Tony" -eq 18];then echo good! fi |
if(条件) print "good!" |
|
| if["Tony" -eq 18];then echo good! else echo "not good!" fi |
if(条件) print "good!" else print "not good!" |
$ echo I am Tony and I am a worker nice to meet you |awk '{for(i=1;i<=NF;i++)if(length($i)>=2)print $i}'
$ echo I am Tony and I am a worker nice to meet you |awk '{for(i=1;i<=NF;i++)print $i}'|awk '{array[$0]++}END{for(i in array)print i,array[i]}'









