Shell编程之正则表达式(非常详细)

正则表达式

1.通配符和正则表达式的区别

通配符一般用于文件名匹配。

正则表达式一般用于匹配文件内容。

2.基本正则表达式

2.1 元字符 (字符匹配)

匹配符1 功能
. 匹配任意单个字符,可以是一个汉字
[ ... ] 匹配指定范围内的任意单个字符
[ ^... ] 匹配指定范围外的任意单个字符
^ [ ... ] 匹配以...开头的
bash 复制代码
#补充说明#
.     #表示匹配任意字符
  
[.  ] #方括号中的. 就是本身的含义 

/.  #和[. ]相同
匹配符2 功能
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:upper:] 大写字母,相当于[A-Z]
[:lower:] 小写字母,相当于[a-z]
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:print:] 可打印字符
[:graph:] 可打印的非空白字符
[:punct:] 标点符号
bash 复制代码
#补充说明#
[:space:] 比[:blank:]包含的范围广
匹配符3 功能
\w 匹配单词构成部分
\W 匹配非单词构成部分
\s 匹配任何非空白字符
\S 匹配任何空白字符,包括空格、制表符、换页符等等
bash 复制代码
#补充说明#
\w 等价于[_[:alnum:]]
\W 等价于[^_[:alnum:]]
\S 等价于 [^ \f\n\r\t\v]
\s 等价于 [ \f\n\r\t\v]

2.2 表示匹配次数

匹配符 功能
* 匹配前面的字符任意次,包括0次
.* 任意长度的任意字符,不包括0次
? 匹配其前面的字符出现0次或1次
+ 匹配其前面的字符出现最少1次
{n} 匹配前面的字符n次
{m,n} 匹配前面的字符至少m次,至多n次
{,n} 匹配前面的字符至多n次,<=n
{n,} 匹配前面的字符至少n次

示例:怎么提取IP地址?

bash 复制代码
ifconfig ens33|grep netmask \
|grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+'|head -n1


# \+ 表示匹配前面的字符最少一次
# \. 表示转译 因为.表示匹配任意字符

2.4 位置锚定

匹配符 功能
^ 行首锚定
$ 行尾锚定
^$ 空行
^ [[:space:]]*$ 空白行
\ < 或 \b 词首锚定
\ > 或 \b 词尾锚定
\bPATTERN\b 匹配整个单词

示例1:统计/etc/fstab 文件中有多少真实单词?

bash 复制代码
cat /etc/fstab | grep -o '\b[a-zA-Z]\+\b'|wc -l
#不要有空格

示例2: 统计/etc/fstab文件中不是已#号开头的非空行的行数

bash 复制代码
cat /etc/fstab | grep "^[^#[:space:]]"  | wc -l
# ^ 以...开头 
#[非# 和 非空行]

#或者
grep -vE "^\s*#|^$"

2.5 分组 和 或者

bash 复制代码
#分组#
( x y) 
将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
bash 复制代码
#或者#
 x \| y 
 x或者y

示例:组合运用

bash 复制代码
echo 1abc 2abc 3abc |grep -o "1\|2abc"
#只匹配了1或者2abc
1  
2abc
echo 1abc 2abc 3abc |grep -o "\(1\|2\)abc"
#1abc或者2abc
1abc
2abc


3.扩展正则表达式

bash 复制代码
#基本格式#
grep -E

-E表示使用扩展正则表达式
匹配符 功能
* 匹配前面子表达式0次或者多次
.* 任意长度的任意字符
匹配前面子表达式0次或者1次,即:可有可无
+ 与星号相似,表示其前面字符出现一次或多次,但必须出现一次,>=1
{n,m} 匹配前面的子表达式n到m次
{m} 匹配前面的子表达式m次
{n,} 匹配前面的子表达式不少于n次, >=n
{,n} 匹配前面的子表达式最多n次,<=n
I 用逻辑或方式指定正则表达式要是用的模式
() 字符串分组,将括号中的字符串作为一个整体

示例1:提取当前主机的IP地址

bash 复制代码
ifconfig ens33 | grep netmask| grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|head -n 1
#-E表示使用扩展正则表达式 

192.168.2.100 #执行结果 

4.部分文本处理工具

4.1 tr 命令

tr命令用于字符转换或字符删除。

bash 复制代码
#基本格式#
tr [选项] 字符集1 字符集2
#字符集1 是要被替换或删除的字符集
#字符集2 是要替换为的字符集
bash 复制代码
#常用选项#

-c 除了指定的字符之外的所有字符都会被替换
-d 表示删除指定的字符
-s 表示压缩重复的字符为单个字符

示例1: 将文本中的大写字母转换为小写字母

bash 复制代码
echo "Hello World" | tr '[:upper:]' '[:lower:]'
hello world

示例2:删除文本中的数字

bash 复制代码
echo "123abc456" | tr -d '[:digit:]'
abc

示例3:将文本中的空格合并为单个空格

bash 复制代码
echo "Hello    World" | tr -s ' '
Hello World

示例4: 删除文本中的特殊字符

bash 复制代码
echo "Hello @#World" | tr -d '@#'
Hello World

4.2 cut命令

cut命令可以提取文本数据中指定的列。
cut命令可以根据指定的字符位置或指定的字段分隔符来截取文本,并将结果输出到标准输出或指定的文件。

bash 复制代码
#基本格式#
cut [选项] 文件
bash 复制代码
-d 指定字段的分隔符,默认为制表符。
-f 指定要提取的字段列表,字段列表之间使用逗号分隔,例如`-f 1,3,5`
-c 指定要提取的字符位置列表,字符位置列表之间使用逗号分隔,例如`-c 1-5,10-15`
--complement 提取指定字段或字符位置之外的内容
bash 复制代码
#提取文件的第一列

cut -f1 file.txt


#提取文件的第二、四、五列,并使用逗号作为分隔符

cut -f2,4,5 -d',' file.txt


#提取文件的前五个字符:

cut -c1-5 file.txt


# 提取文件的第一列以外的所有列:

cut -f 2 --complement file.txt

4.3 sort命令

sort命令用于对文本文件进行排序,默认以字母排序。

bash 复制代码
#基本格式#
sort [选项] file
bash 复制代码
#常用选项#
-b 忽略行首空白字符
-r 以倒序方式进行排序
-f 忽略大小写进行排序
-n 按照数值大小进行排序
-u 去除重复行
-t 指定字段分隔符
-k 指定按照字段排序

4.4 uniq命令

uniq 命令用于找出或删除文本文件中连续出现的重复行。

bash 复制代码
#基本格式#
uniq [选项] [输入文件 [输出文件]]

#如果不指定输入文件,则会从标准输入获取数据
#如果不指定输出文件,则结果会打印到标准输出
bash 复制代码
#常用选项#

-c  在输出结果中显示每行重复出现的次数。
-d  只显示重复行。
-u  只显示不重复的行。
相关推荐
晚霞的不甘13 小时前
Flutter for OpenHarmony 创意实战:打造一款炫酷的“太空舱”倒计时应用
开发语言·前端·flutter·正则表达式·前端框架·postman
晚霞的不甘15 小时前
Flutter for OpenHarmony 进阶实战:打造 60FPS 流畅的物理切水果游戏
javascript·flutter·游戏·云原生·正则表达式
晚霞的不甘19 小时前
Flutter for OpenHarmony 布局探秘:从理论到实战构建交互式组件讲解应用
开发语言·前端·flutter·正则表达式·前端框架·firefox·鸿蒙
晚霞的不甘2 天前
Flutter 布局核心:构建交互式文档应用
开发语言·javascript·flutter·elasticsearch·正则表达式
安然无虞2 天前
「正则表达式」精讲
开发语言·测试工具·正则表达式
期末考复习中,蓝桥杯都没时间学了2 天前
正则表达式相关知识点
正则表达式
Peter·Pan爱编程2 天前
RegexBox:让正则表达式变得简单,AI 驱动的正则工具箱
人工智能·正则表达式
独自破碎E3 天前
动态规划-正则表达式匹配
算法·正则表达式·动态规划
葡萄成熟时 !4 天前
正则表达式
java·正则表达式
FJW0208144 天前
Python正则表达式
python·正则表达式