正则表达式笔记
通配符:匹配文件名
正则表达式:主要用来匹配字符串(命令结果,文本内容)
注意:使用正则表达式时一定要加引号
正则表达式需要配合相关工具使用
注:可以使用 man 7 regex 查询帮助
元字符
. 匹配任意单个字符,可以是一个汉字
[root@localhost ~]# ls /etc/|grep rc[.0-5]
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc.d
rc.local
#匹配. 0 1 2 3 4 5
[root@localhost ~]# grep r....t /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
#这里r...t 的...指中间三个任意字符
[root@localhost ~]# echo abc|grep a.c
abc
#这里的a.c中的.代表任意一个字符
[root@localhost ~]# echo abc |grep a\.c
abc
#如果不加引号匹配时会有出入
[root@localhost ~]# echo abc |grep 'a\.c'
[root@localhost ~]#
#标准格式需要加'' 或者""
[] 匹配指定范围内的任意单个字符
[root@localhost ~]# cat 1.txt|grep [an]
adpdnsfpdsfnav
abc aasdsd
abcnid
acaca
dasvacvz:
#只要有a n 这个两个字符就能输出
[root@localhost ~]# ls [a-d].txt
a.txt A.txt b.txt B.txt c.txt C.txt d.txt
#查看a A b B c C d D .txt文件
[root@localhost ~]# ls |grep '[a-d].txt'
aa.txt
a.txt
b.txt
c.txt
d.txt
#匹配a b c d中任意字符(没有大写没有大写没有大写)
[root@localhost ~]# ls |grep '[^a-z].txt'
A.txt
B.txt
#显示非小写字母
#[]里就是本意不需要转义
查看当前文件夹下包含p y z s这四个字母的文件
[^]匹配指定范围外的任意单个字符
[:alnum:] 字母和数字 [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:blank:] 空白字符(空格和制表符) [:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
\w #匹配单词构成部分,等价于[ _ [:alnum:]] \W #匹配非单词构成部分,等价于[ _^ [:alnum:]] \S #匹配任何非空白字符。等价于[ ^ \f\n\r\t\v]。 \s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
扩展正则表达式
grep -E
egrep
表示次数
* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* #任意长度的任意字符
\? #匹配其前面的字符出现0次或1次,即:可有可无
\+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\} #匹配前面的字符n次
\{m,n\} #匹配前面的字符至少m次,至多n次
\{,n\} #匹配前面的字符至多n次,<=n
\{n,\} #匹配前面的字符至少n次
[root@localhost ~]# cat py.txt|grep -E 'py{5}'
pyyyyyyyyyyyyyyyy
pyyyyyshuai
#y出现5次
[root@localhost ~]# cat py.txt|grep -E 'py{5,}'
pyyyyyyyyyyyyyyyy
pyyyyyshuai
#y出现5次及以上
[root@localhost ~]# cat py.txt|grep 'py\{2,5\}shuai'
pyyyyyshuai
pyyshuai
pyyyyshuai
#中间的y出现2~5次
[root@localhost ~]# cat py.txt|grep 'py*shuai'
pyyyyyshuai
pyyshuai
pyyyyshuai
pyshuai
#代表任意次的y
[root@localhost ~]# echo pshuai|grep 'py*shuai'
pshuai
#出现0次的y也可以
[root@localhost ~]# echo ppppshuai|grep 'py*shuai'
ppppshuai
#grep包含最前面的g
[root@localhost ~]# echo ppppshuai|grep 'p.*i'
ppppshuai
#.*代表中间任意字符任意数量
[root@localhost ~]# echo pyyshuai|grep 'py\?shuai'
[root@localhost ~]# echo pyshuai|grep 'py\?shuai'
pyshuai
[root@localhost ~]# echo pshuai|grep 'py\?shuai'
pshuai
# \?代表中间一次或0次y
[root@localhost ~]# echo pyyyshuai|grep 'py\+shuai'
pyyyshuai
# \+ 一个以上包括一个
位置锚定
^ #行首锚定, 用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行 (单独一行 只有root)
^$ #空行
^[[:space:]]*$ #空白行
\< 或 \b #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
\> 或 \b #词尾锚定,用于单词模式的右侧
\<PATTERN\> #匹配整个单词
[root@localhost ~]# grep "^#" /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Aug 31 23:06:58 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
#过滤出#开头行
[root@localhost ~]# grep "^[^#]" /etc/fstab
/dev/mapper/centos-root / xfs defaults 0 0
UUID=20e1dc26-0abf-4b8b-8e06-c39d2e3fe3b8 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
#过滤出非#开头的行
[root@localhost ~]# echo hello-123|grep "\<123"
hello-123
[root@localhost ~]# echo hello_123|grep "\<123"
[root@localhost ~]#
因为_算单词内部所以下面不能找到123开头的
Hello-123是两个单词
Hello_123 是一个单词
分组或其他
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:(root)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名
方式为: \1, \2, \3, ...
[root@localhost ~]# echo pyyy|grep "py\{3\}"
pyyy
[root@localhost ~]# echo pypypy|grep "\(py\)\{3\}"
pypypy
#分组把py当成一组,匹配三次py
[root@localhost ~]#ifconfig ens33|grep netmask|grep -o '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{3\}'|head -1
192.168.91.100
小工具
tr工具
--对来自标准输入的字符进行替换,压缩和删除
tr [opotions] [参数]
常用选项
-c 取代所有不属于第一字符集的字符
-d 删除所有属于第一字符集的字符
-s 把连续重复的字符以单独一个字符表示
1.把输入的字符转换大小写
[root@localhost ~]# echo "abc"|tr 'a-z' 'A-Z'
ABC
2.tr -s 压缩重复的字符
[root@localhost ~]# echo "pyyyyyyshuaiiiii"|tr -s "yi"
pyshuai
3.删除某些字符
[root@localhost ~]# echo "pyyyyyyshuaiiiii"|tr -d "yi"
pshua
P.S
有标准输出的才能用管道符
如果没有标准输出可以用xargs读取
echo stu{1..10}|xargs -n1 useradd 批量创建10个用户
-n1 代表一次传一个,这样就能批量创建用户
echo {1..10}.txt|xargs -n1 touch
批量创建1~10.txt文件