正则表达式

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) ^ 以……开头的行


image.png

2) $ 以……结尾的行


image.png

3) ^$ 空行

  • 空行这一行没有任何内容(空格属于字符)
  • 匹配出空行


    image.png
  • 应用
    • 排除文件空行


      image.png

4) . 表示任意一个字符

  • 注意 不匹配空行


    image.png

5) 匹配出以.结尾的行(转义字符\)


image.png
  • 转义字符序列:
    • \n 回车换行
    • \t tab键

6) * 前一个字符连续出现0次或0次以上


image.png
  • * 的使用(前面字符出现0次或0次以上)当出现0次既相当于cat(grep '' test.txt)


    image.png

7) .* 所有内容,任何内容,任意内容


image.png
  • 注意正则表达式的贪婪匹配(尽可能的匹配更多)


    image.png

8) [] [abc]1次匹配一个任意字符(a或b或c)

 
image.png
  • ()小括号
  • []中括号
  • {}大括号
  • [0-9]
  • [a-z]
  • [A-Z]
  • [a-zA-Z0-9]
  • [a-Z0-9]
  • grep -i [a-z0-9] (-i参数不区分大小写)
  • []中括号里面的内容一般会失去特殊含义

9) [^] [^abc]取反,排除 排除a或b或c的内容


image.png

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
image.png

2)| 或者

image.png
符号 含义 应用场景
[] 1次匹配1个字符 匹配单个字符 [] 和 +
| 匹配1个字符或多个 匹配整个单词

3)() 被括起来的内容,表示一个整体(一个字符) 反向引用(sed)


image.png

4){} 连续出现

符号 含义
o{n,m} 前一个字母o至少连续出现了n次,最多连续出现了m次
o{n} 前一个字母o连续出现了n次
o{n,} 前一个字母o至少连续出现了n次
o{,m} 前一个字母o至多连续出现了m次
image.png

image.png

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

image.png

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


image.png
  • \w [a-zA-Z0-9]
image.png

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

image.png

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

image.png

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$/
^$ 表示空行 某一列空
  1. 特殊模式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]}'

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容