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 

 

posted @ 2020-11-02 20:03  小楼夜听雨QAQ  阅读(440)  评论(0编辑  收藏  举报