linux正则表达式的用法
概述
本文demo的测试环境为CentOS 8、Ubuntu。
参考书籍:《鸟哥的Linux私房菜——基础篇(第四版)》,喜欢原汁原味的小伙伴可以看原作。本文是对其正则表达式章节的总结,并添加了个人的一些理解。如果错误,欢迎批评指正!
grep命令
grep是一个很常用的命令,它支持正则表达式,可以按照特定需求,将字符串按照一定格式打印出来。比如之前经常用的
ps -ef | grep java
查找包含“java”的所有进程。
所有测试所用到的数据都在书中作者提供的一个文件里,有需要的小伙伴可以直接下载。
wget http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt
grep的简单使用
#搜索带有java的行数 -n表示带行号 grep -n 'java' regular_express.txt #搜索不带java的行数 grep -vn 'java' regular_express.txt #忽略大小 grep -in 'java' regular_express.txt
[ ]
中括号:表示取其中任意一个字符。例如[abc],表示取a、b、c中的一个。
#搜寻文件中的test或者tast,-n表示带行号 grep -n 't[ae]st' regular_express.txt
^ 在不同的情况下,表示的含义不一样。
#包含oo grep -n 'oo' regular_express.txt #非g开头 grep -g '[^g]oo' regular_express.txt
- 在中括号外表示首行的意思
#The开头 grep -n '^The' regular_express.txt
在第二种语义下,与之相对的是 $ 美元符号
#表示以点结尾的行 grep -n '\.$' regular_express.txt #一首一尾,没有空格,表示空白行 grep -n '^$' regular_express.txt
- 表示小写字母。大写字母同理
#小写字母开头,后面跟oo grep -n '[a-z]oo' regular_express.txt
- 多个范围,例如字母数字
#字母数字,后面跟oo grep -n '[A-Za-z0-9]oo' regular_express.txt
. 和 *
虽然都是占位符,但是点(.)表示一定占一个位置,而星号(*)
#表示列举test目录下以sh结尾的文件
ls -l /root/test/*sh
而在正则里面,*需要和前面一个字符联系在一起看,比如” a* “则表示,零个或者多个a
‘ooo*’要拆下来理解,分为两部分 'oo'和'o*'前者表示已经确定的两个o,后者表示零个或者无数个o,结合起来看就是,两个或者两个以上连续的o
#表示含有good grep -n 'g..d' regular_express.txt #表示至少两个o grep -n 'ooo*' regular_express.txt #如果想表示任意字符,比如两个g之间可以有任何字符,可以通过组合'.*'来实现,表示可能有零个或者有多个点,而点表示任意一个数,所以结合起来 grep -n 'g.*g' regular_express.txt #任意数字 grep -n '[0-9][0-9]*' regular_express.txt #只包含数字 grep -n '^[0-9][0-9]*$' regular_express.txt
{}
大括号限定连续的范围,需要和 * 联系起来
#表示两个或者两个以上的o grep -n 'ooo*' regular_express.txt #和上面一个没啥区别,表示两个或两个以上的o grep -n 'o\{2\}' regular_express.txt #两个到五个 grep -n 'o\{2, 5\}' regular_express.txt
sed和awk
sed和awk也是对数据进行处理的工具,不过侧重点不同,sed侧重要对一行一行的数据进行处理,awk侧重于把每一行分成数个字段,进行处理,相对来说,更加精细一点。
这边先列举sed的几个测试demo,日后会对这两个命令进行更深入的学习。
关于sed的详细说明,可以参考:
https://blog.csdn.net/wdz306ling/article/details/80087889
删除与新增
删除(d,delete)
#删除第二行 #nl表示将目标内容加上行号后,写到标准输出 nl /etc/passwd | sed '2d' #删除二到五行 nl /etc/passwd | sed '2,5d' #删除第二行到末尾 nl /etc/passwd | sed '2,$d'
新增(a, add)
目标行的后面一行
#在第2行和第3行之间加上drink milk nl /etc/passwd | sed '2a drink milk' #加上多行 nl /etc/passwd | sed '2a drink milk / tea / coco'
新增(i)
目标行的前面一行
#在第2行和第1行之间加上 drink milk nl /etc/passwd | sed '2i drink milk'
以行为单位的取代与显示功能
替换
#将指定行数替换为自定义内容 #将第2到5行替换为MySelf Define nl /etc/passwd | sed '2, 5c MySelf Define'
显示
#第五到七行 nl /etc/passwd | sed -n '5, 7p
永久修改
-i 参数可以改变源文件的内容,慎用
#每一行结尾若是.则改成! sed -i 's/\.$/\!/g' regular_express.txt #最后一行加上一句话:This is a test。 #$表示最后一行,a表示新增 sed -i '$a # This is a test' regular_express.txt