由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符。
正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等
① [root@localhost ~]#ls /etc/|grep rc[.0-6]
② [root@localhost ~]#ls /etc/ | grep 'rc\.'
③ [root@localhost ~]# grep r..t /etc/passwd
④ [root@localhost ~]# echo abc |grep a.c
⑤ [root@localhost ~]# echo abc |grep 'a\.c'
#标准格式需要加'' 或者 " "
⑥ [root@localhost ~]# ls |grep '[zhou].txt'
⑦ [root@localhost ~]# ls [a-d].txt
#通配符
a.txt A.txt b.txt B.txt c.txt C.txt d.txt
⑧ [root@localhost ~]# ls |grep '[^a-z].txt'
⑨ [root@localhost ~]# ls |grep '[^a.z].txt'
#[]里就是本意不需要转义
⑩ [root@localhost ky15]#grep [[:space:]] zhen.txt
11 [root@localhost ky15]#grep [[:space:]] zhen.txt |cat -A
12 [root@localhost ~]#ls /etc/ |grep "rc[.0-6]" rc. rc0 rc1 rc2 rc3 rc6
[root@localhost ~]#ls /etc/ |grep "rc[.0-6]."
②[ ]:在正则表达式中[ ]表示匹配[ ]中任意一个字符
[root@pc1 data]#touch {a..c}.txt #创建a-c.txt文件夹
[root@pc1 data]#ls #显示文件夹内容
a.txt b.txt c.txt
[root@pc1 data]#ls |grep '[a-z].txt' #使用grep过滤ls中有任意一个a-z字母.txt的文件
a.txt
b.txt
c.txt
③[^]:在正则表达式中表示匹配[ ]中外的任意单个字符
[root@pc1 data]#touch {a..b}.txt #创建a-b.txt文件
[root@pc1 data]#touch {0..2}.txt #创建0-2.txt文件
[root@pc1 data]#ls #显示文件
0.txt 1.txt a.txt b.txt
[root@pc1 data]#ls |grep '[^0-9].txt' #过滤ls显示文件中除去0-9任意字符.txt文件
a.txt
b.txt
c.txt
[root@pc1 data]#ls |grep '[^a-z].txt' #过滤ls显示文件中除去a-z任意字符.txt文件
0.txt
1.txt
2.txt
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
[root@pc1 data]#echo AB12ab | grep -o '[[:alpha:]]' #过滤输出内容的字母
A
B
a
b
[root@pc1 data]#echo AB12ab | grep -o '[[:alnum:]]' #过滤输出内容的字母和数字
A
B
1
2
a
b
[root@pc1 data]#echo AB12ab | grep -o '[[:lower:]]' #过滤输出内容的小写字母
a
b
[root@pc1 data]#echo AB12ab | grep -o '[[:upper:]]' #过滤输出内容的大写字母
A
① * :表示匹配前面字符任意次,包括0次
[root@pc1 ~]#echo ac |grep 'ab*c' #ab之间不输入b可匹配
ac
[root@pc1 ~]#echo abc |grep 'ab*c' #ab之间输入1个b可匹配
abc
[root@pc1 ~]#echo abbc |grep 'ab*c'#ab之间输入2个b可匹配
abbc
② .* :表示匹配前面字符任意次,包括0次
[root@pc1 ~]#echo ac |grep 'ab.*c' #ac之间不输入b匹配不到
[root@pc1 ~]#echo abc |grep 'ab.*c' #ac之间输入1个b可以匹配
abc
[root@pc1 ~]#echo abbc |grep 'ab.*c' #ac直接输入2个b可以匹配
abbc
③ \? :表示匹配前面字符1次或0次,可有可无
[root@pc1 ~]#echo ac | grep 'ab\?c' #ac之间不输入b可以匹配
ac
[root@pc1 ~]#echo abc | grep 'ab\?c' #ac之间输入1个b可以匹配
abc
[root@pc1 ~]#echo abbc | grep 'ab\?c' #ac之间输入2个b匹配不到
④ \+ :表示匹配前面字符最少1次。
[root@pc1 ~]#echo ac | grep 'ab\+c' #ac之间不输入b匹配不到
[root@pc1 ~]#echo abc | grep 'ab\+c' #ac之间输入1个b可以匹配
abc
[root@pc1 ~]#echo abbbbc | grep 'ab\+c' #ac之间输入多个b可以匹配
abbbbc
⑤ \{n\} :表示匹配前面的字符n次
[root@pc1 ~]#echo abbbc |grep 'ab\{3\}c' #输出abbbc匹配ac之间b字符出现3次可以匹配
abbbc
[root@pc1 ~]#echo abbbbc |grep 'ab\{3\}c' #输出abbbbc匹配ac之间b字符出现3次匹配不到
⑥ \{m,n\} :表示匹配前面字符最少m次最多n次
[root@pc1 ~]#echo abc |grep 'ab\{1,3\}c' #输出abc匹配ac之间b出现最少1次最多3次可以匹配
abc
[root@pc1 ~]#echo abbc |grep 'ab\{1,3\}c' #输出abbc匹配ac之间b出现最少1次最多3次可以匹配
abbc
[root@pc1 ~]#echo abbbc |grep 'ab\{1,3\}c'#输出abbbc匹配ac之间b出现最少1次最多3次可以匹配
abbbc
[root@pc1 ~]#echo abbbbc |grep 'ab\{1,3\}c'#输出abbbbc匹配ac之间b出现最少1次最多3次匹配不到
⑦\{m,\}:
⑧\{,n\}:
① ^ 表示以什么字符开头的行。
② $ 表示以什么字符为结尾的行。
③ ^PATTERN$ 表示用于模式匹配整行 (单独一行 只有PATTERN字符)。
④ ^$ 表示空行。
⑤ \< 或 \b #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)。
⑥ \> 或 \b #词尾锚定,用于单词模式的右侧。
⑦ \ #匹配整个单词。
举例
[root@pc1 ~]#cat a.txt #查看a.txt内容
root
abc abd abf abe
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep '^a' #查看a.txt内容过滤以a开头的行
abc abd abf abe
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep 'e$' #查看a.txt内容过滤以e为结尾的行
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep '^root$' #查看a.txt内容过滤只有root字符的行
root
[root@pc1 ~]#cat a.txt |grep '\ba' #查看a.txt过滤以a开头的词
abc abd abf abe
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep 'e\b' #查看a.txt过滤以e为结尾的词
abc abd abf abe
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep -o '\babc\b' #查看a.txt过滤次abc
abc
()将多个字符捆绑在一起当做一个整体处理
[root@pc1 ~]#echo abcccc |grep "abc\{4\}" #匹配输出内容c出现4次
abcccc
[root@pc1 ~]#echo abcccc |grep "\(abc\)\{4\}" #abc字符加()分组匹配输出内容abc出现4次,无abc出现4次匹配不到
[root@pc1 ~]#echo abcabcabcabc |grep "\(abc\)\{4\}" #abc字符加()分组匹配输出内容abc出现4次匹配成功
abcabcabcabc
grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。在Linux中也就是代表我们定义的模式模板,Linux工具可以用它来过滤文本
①使用方法
grep -E选项加正则表达式内容,与正常正则表达式区别在于不用在匹配时添加 \
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
{,n} #匹配前面的字符至多n次,<=n,n可以为0
{n,} #匹配前面的字符至少n次,<=n,n可以为0
() 分组
awk为流编辑器,即读取文件一行处理一行。不同于vi编辑器等是将文件整个缓存在内容中处理。
使用格式
awk [选项] '处理模式{处理动作}'
'{ }'为固定格式
举例:取出sda硬盘的容量
[root@pc1 data]#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 2G 0 part /boot
└─sda2 8:2 0 54G 0 part
├─centos-root 253:0 0 50G 0 lvm /
└─centos-swap 253:1 0 4G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
sdd 8:48 0 20G 0 disk
sr0 11:0 1 4.2G 0 rom
[root@pc1 data]#lsblk |grep -w sda #通过过滤sda字符将sda此行过滤出
sda 8:0 0 60G 0 disk
[root@pc1 data]#lsblk |grep -w sda | awk '{print $4}' #使用awk不指定分隔符 打印出第4列
60G
①基本格式:awk [选项] '处理模式{处理动作}'
②print动作:打印,打印'{print $1}'即为打印第一列,'{print $n}'即打印为第n列,'{print $n,$m}'即为打印第n列和第m列。
③print打印顺序:'BEGIN{print "1"} END {print "2"} {print "3"} ',首先打印BEGIN后的print 1,然后打印print 3 最后打印END后的print 2,BEGIN表示第一个打印,END表示最后打印
举例1:
[root@pc1 data]#cat test.txt #创建文件
1 2 3 4 5 6 7 8 @test.txt 文件内容
[root@pc1 data]#awk '{print $1}' test.txt #使用awk处理文件test.txt打印第1列
1
[root@pc1 data]#awk '{print $5}' test.txt #使用awk处理文件test.txt打印第5列
5
[root@pc1 data]#awk '{print $1,$5}' test.txt #使用awk处理文件test.txt打印第1列和第5列
1 5
举例2:
[root@pc1 data]# awk 'BEGIN{print "1"} END{print "$2"} {print "3"}' test.txt
1
3
2
①基本格式:awk [选项] '处理模式{处理动作}'
②选项若不写默认为以空格为分隔符处理,且会将空格自动压缩。
③-F 选项 指定分隔符,即指定以什么为分隔符处理内容
举例:
[root@pc1 data]#cat test.txt #编辑test.txt内容
one two three
root:lisi:zhangsan
[root@pc1 data]#awk '{print $2}' test.txt #默认过滤test内容以空格为分隔符打印出第2列为two
two
[root@pc1 data]#awk -F : '{print $2}' test.txt #使用-F选项指定以:为分隔符打印出第2列为lisi
lisi
①基本格式:awk [选项] '处理模式{处理动作}'
②处理模式为空表示无其他额外条件。
③正则表达式匹配模式
正则匹配:与正则表达式配合使用。
举例:
[root@pc1 data]#cat test.txt #创建test.txt
root 1 abc 2 3 4 5 6 7 8
abcd
sadfasdf root
[root@pc1 data]#awk '/^root/{print $2}' test.txt #使用awk配合正则表达式打印出test.txt文件中以root为开头的行的第二列,注意处理模式在固定格式'{}'的单引号中
1 #匹配出的内容
[root@pc1 data]#awk '/^root/,/root$/{print $2}' test.txt #使用awk配合正则表达式打印出test.txt文件中以root为开头的且以root结尾的第二列,注意处理模式在固定格式'{}'的单引号中
1
root #匹配出的内容
比较操作符:==, !=, >, >=, <, <=
逻辑操作符:&&与 并且的关系,||或 或者关系,!非 取反关系
①FS :指定每行文本的字段分隔符,缺省为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:"
[root@pc1 data]#cat a.txt
a:b:c
[root@pc1 data]#awk -v "FS=:" '{print $2}' a.txt 使用FS变量指定:为分隔符打印a.txt文件的第二列
b
②OFS:输出时的分隔符
[root@pc1 data]#cat a.txt
a:b:c
[root@pc1 data]#awk -v "FS=:" -v OFS="==" '{print $1OFS$3}' a.txt 使用FS变量指定:为分隔符且指定输出分隔符OFS为==,打印a.txt文件的第1列和第3列
a==b
③NF:当前处理的行的字段个数即处理行有多少列,默认按空格分列,可指定。
举例
awk -F : '{print NF}' /etc/passwd |head -n 1
#指定:为分隔符打印出文件/etc/passwd第一行有多少个字段,即多少列
7
awk -F : '{print $(NF-1)}' /etc/passwd |head -n 1
#指定:为分隔符打印出文件/etc/passwd第一行的倒数第二个字段,即倒数第二列
/root
举例
awk -F : 'NR==1{print $1}' /etc/passwd
#指定:为分隔符打印出/etc/passwd文件第一行的第一个变量,注意模式要写在'模式{}'位置
root
awk -F : 'NR>=1 && NR<=3{PRINT $1}' /etc/passwd
#指定:为分隔符打印出/etc/passwd文件大于等于第一行且小于等于第三行的第三个变量
root
bin
daemon
#awk -F : 'NR==1{print $0}' /etc/passwd
#指定:为分隔符打印出文件/etc/passwd第一行的所有内容
root:x:0:0:root:/root:/bin/bash
awk -F : 'NR>=1 && NR<=3{print $0}' /etc/passwd
#指定:为分隔符打印出文件/etc/passwd大于等于第一行且小于等于第三行的所有内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
⑥$n:当前处理行的第n个字段(第n列)
⑦FILENAME:被处理的文件名
⑧RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n
sed编辑器时一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要存储在一个命令文本文件中。
sed 的工作流程主要包括读取、执行和显示三个过程:
读取: sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )。
执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行, 除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流(屏幕)。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
sed [选项]... '{自身脚本语法};....' [input file...]
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑[root@www data]#sed -n -e '/^r/p' -e'/^b/p' /etc/passwd
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
sed ' ' #交互模式输入一行,自动打印一行相同的
sed -n ' ' #交互模式输入一行,关闭自动打印
sed -n ' p' #加上p又恢复自动打印,与sed ' '相同
sed -n '4p' /etc/fstab #打印第四行内容
ifconfig ens33 |sed -n '2,4p' #打印网卡信息的2至4行
cat -n /etc/passwd |sed -n '2,+4p'#打印第2至6行,即第二行开始往后四行
sed '3q' /etc/passwd
#打印三行后退出
sed -n '$p' /etc/passwd #打印最后一行使用通配符
sed ' ' /etc/fstab
sed -n ' p' /etc/fatab
sed -n '/root/p' /etc/passwd
#从第二行开始,找到root为止
sed -n '2,/root/p' /etc/passwd
‘#,/关键字/p’ 从第#行开始匹配
#从第二行开始,找到root为止
seq 10 |sed -n '1~2p'
seq 10 |sed '2~2d'
#打印奇数行
seq 10 |sed -n '2~2p'
seq 10 |sed '1~2d'
#打印偶数行
cat 1.txt |sed '3d'
#删除第三行并显示出来
注 删除指定行并不是真正删除,只是将删除了的结果显示出来,并不是真正删除了
sed '2,4d' seq.txt
#删除连续的2到4行
sed '/^$/d' /opt/seq.txt #删除文本中的空行
sed '/nologin$/!d' /etc/passwd
#删除不是以nologin结尾的行
sed '/nologin$/!d' /etc/passwd
#删除不是以nologin结尾的行
sed -i.bak '3d' 1.txt
#原文件删除第三行,并原文备份
插入内容
sed -i '2a charu' 1.txt
#在第二行后插入内容
sed -i '2a\\n charu2' 1.txt
#插入空行,多添加一个\
sed -i '2ctihuan' 1.txt
#将第二行的内容替换成tihuan
seq 10|sed -n '2!p'
#不显示第二行
①查几点到几点之间的日志
sed -n '/2023:08:09/,/2023:09:42:37/p' access_log
②修改全局,后加g
sed -i 's/root/admin/g' /etc/passwd
#将全局出现的root修改为admin
③修改多行,使用r及e
④修改selinux开机不启动配置文件
举例:
seq 5 |sed #生成1-5数字传给sed
#该格式报错,基本格式中的'{自身脚本语法}'不可以不写,可以写空则是默认打印全部内容如下
seq 5 | sed ''
1
2
3
4
5
2、sed脚本语法及命令
①sed脚本语法:地址+sed自己脚本命令,地址即范围例如全文或第一行,第一行至第三行等范围
②sed脚本命令:
p 将内容打印到屏幕,使用时关闭自动打印功能,-n选项
q 到指定的内容即退出,例如打印到第三行直接退出
IP 内容忽略大小写,使用时关闭自动打印功能,-n选项
d 删除指定内容
a 在指定位置添加内容
c 替换指定内容
~ 步进,0~2,2个间隔,1~2,1个间隔 seq 10 |sed -n '0~2p'每间隔2个打印一次
① -n 选项,sed默认有自动打印功能,-n选项是关闭打印功能,一般配合脚本命令p使用
②-r 选项,开启扩展正则表达式
③-i 选项,在文件中添加内容,可以在-i是加.bak后缀备份修改的文件。例如 sed -i.bak a.txt会在同目录下生成一个a.txt.bak文件
④
⑤
格式:sed '/可使用正则表达式选择范围/'s/查找内容/替换内容/g g表示全文,固定格式的///可以用###等符号替换
注意:查找内容可使用正则表达式,替换内容不可使用正则表达式
举例1:
搜索/etc/passwd 中包含root字符的行
sed -nr '/root/p' /etc/passwd #-n关闭自动打印,-r启用扩展正则表达式查询root字符并打印
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin #查询结果
举例2:
使用sed关闭selinux
cat /etc/selinux/config #查看selinux配置文件内容
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#-i选项备份selinux配置文件后缀加.bak,在config文件中找到SELINUX=enforcing修改为SELINUX=disabled,g表示所有搜索到的内容都替换。单引号中''s之前可加行号
( )内的按顺序标为123 ,引用时\1调用第一个()的内容,\n表示调用第n个()的内容。
.*表示任意长度字符不管是什么字符
举例1:取ip地址
ifconfig ens33 |sed -nr 's/.*inet (.*) netmask.*/\1/p'
#查看ens33的网卡信息传给sed处理,-n选项关闭自动打印,-r选项开启扩展正则表达式
's///'查找替换标准格式,.*inet 表示以inet为止的前面所有字符 (.*) 括号表示使用反向引用
.*表示该处的任意字符 netmask.*表示以netmask开头后面的所有字符。\1表示反向引用第一个()的
内容,p表示打印出来
192.168.30.11 #打印结果
举例2:
echo abc123XYZ | sed -nr 's/(abc)(123)(XYZ)/\3\2\1/p'
#打印abc123XYZ传给sed处理变成XYZ123ABC,-n选项关闭自动打印,-r选项开启扩展正则表达式
's///'查找替换标准格式。三个()括起来的内容分别表示元素123,调用时改变调用顺序打印即可改变内容顺序
XYZ123abc #打印结果
使用sed查询是可以直接调用变量,注意必须用“ ”号或者俩个双引号,单引号不识别变量