三剑客正则表达式

基础正则grep、sed、awk

先创建一个文件

[root@zheng ~]# cat -n /zyf/jianli.txt          
     1  I am student!
     2  I like Liunx.
     3
     4  I like basketball
     5  I like badminton ball ,billiard ball and chinese chess!
     6  my blog is http://oldboy.blog.51cto.com
     7  our size is http://blog.oldoyedu.com
     8  my WeChat is 13522828457
     9
    10  not 490000448.
    11  my god ,i an not oldbey,but OlDEBOY!

" ^ "查找开头为…的行

查找以m开头的行

[root@zheng ~]# grep -n "^m" /zyf/jianli.txt 
6:my blog is http://oldboy.blog.51cto.com
8:my WeChat is 13522828457
11:my god ,i an not oldbey,but OlDEBOY!

" $ " 查找结尾为…的行

查找以m结尾的行

[root@zheng ~]# grep -n "m$" /zyf/jianli.txt 
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com

这里补充一下
如果有但是搜索不到话有可能是m后面多了一个空格,在复制粘贴的时候经常出现
可以用cat -A查看
带 $ 的就是空或者回车

[root@zheng ~]# cat -A /zyf/jianli.txt 
I am student!$
I like Liunx.$
$
I like basketball$
I like badminton ball ,billiard ball and chinese chess!$
my blog is http://oldboy.blog.51cto.com$
our size is http://blog.oldoyedu.com$
my WeChat is 13522828457$
$
not 490000448.$
my god ,i an not oldbey,but OlDEBOY!$

" ^$ " 显示空行

显示空行

[root@zheng ~]# grep -n "^$" /zyf/jianli.txt 
3:
9:

加-v参数,反选,除了空行全显示

[root@zheng ~]# grep -nv "^$" /zyf/jianli.txt 
1:I am student!
2:I like Liunx.
4:I like basketball
5:I like badminton ball ,billiard ball and chinese chess!
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
8:my WeChat is 13522828457
10:not 490000448.
11:my god ,i an not oldbey,but OlDEBOY!

" * " 前一个字符连续出现0次或0次以上

前一个字符连续出现0次或0次以上
显示blog出现的次数
加上-o显示次数

[root@zheng ~]# grep "blog*" /zyf/jianli.txt  
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldoyedu.com
[root@zheng ~]# grep "blog*" /zyf/jianli.txt -o
blog
blog
blog

在这里插入图片描述

" . " 匹配任意字符,不匹配空行

匹配任意字符,不匹配空行

在这里插入图片描述

-o 一个字符一个字符显示

[root@zheng ~]# grep -no "." /zyf/jianli.txt  
1:I
1: 
1:a
1:m
1: 
1:s
1:t
1:u
1:d
1:e
1:n
1:t
1:!
2:I
2: 
2:l
2:i
2:k
2:e
2: 
2:L
2:i
2:u
2:n
2:x
2:.
4:I
4: 
4:l
4:i

....
.....后面的就不粘贴了

" .* " 所有符号,任何连续出现的字符

所有的任何符号,包含空行、多个空格

贪婪性
.*所有符号,任何符号,连续出现的符号,有多少匹配多少
显示从开头到结尾为o的行
所以这里会显示到第一个o还没有结束后,一直到最后一个o才结束

[root@zheng ~]# grep -n "^.*o" /zyf/jianli.txt 
5:I like badminton ball ,billiard ball and chinese chess!
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
10:not 490000448.
11:my god ,i an not oldbey,but OlDEBOY!

在这里插入图片描述

显示从开头到p结束的行

[root@zheng ~]# grep -n "^.*p" /zyf/jianli.txt  
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com

在这里插入图片描述

" \ "

撬棍 转义字符

撬棍,转义字符,如果要是查询符号的话可能会与命令的参数冲突,这个时候加上 \ 就可以了
可以搜一下点
前面有提到过点事所有字符,所以光搜点的话需要加上 \ 转义一下

[root@zheng ~]# grep -n  "\." /zyf/jianli.txt  
2:I like Liunx.
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
10:not 490000448.

#  查询以点结尾的行
[root@zheng ~]# grep -n  "\.$" /zyf/jianli.txt 
2:I like Liunx.
10:not 490000448.

转义字符系列

\n 回车换行
\t 按一次tab 8个空格长度
tr 把文件中所有回车替换成 tab

[root@zheng ~]# tr '\n' '\t' </zyf/jianli.txt   
I am student!   I like Liunx.           I like basketball       I like badminton ball ,billiard ball and chinese chess!        my blog is http://oldboy.blog.51cto.com our size is http://blog.oldoyedu.com   my WeChat is 13522828457                not 490000448.my god ,i an not oldbey,but OlDEBOY!     [root@zheng ~]# 

在这里插入图片描述

’ [ ] ’ 匹配多个字符

匹配小写a到小写z的行
在单引号的中括号里,里面的字符就没有特殊含义了不用再添加撬棍来转义
还有[A-Z]
[0-9]
也可以这么写
[a-zA-Z0-9]
如果不想搜索这么多也可以缩小范围
[1-5]这种也可以

[root@zheng ~]# grep '[a-z]' /zyf/jianli.txt 
I am student!
I like Liunx.
I like basketball
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldoyedu.com
my WeChat is 13522828457
not 490000448.
my god ,i an not oldbey,but OlDEBOY!

在这里插入图片描述

查找开头为…和结尾为…的行

这里 ^和$ 都是放在中括号外头的
先匹配开头为o或者m的行
然后通过管道命令再匹配结尾为m的行

[root@zheng ~]# grep -n '^[om]' /zyf/jianli.txt |grep '[m.]$'
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com

在这里插入图片描述

排除输入的字符

排除掉文件全部的小写字母
只显示符号,大写字母,数字

[root@zheng ~]# grep -n '[^a-z]' /zyf/jianli.txt 
1:I am student!
2:I like Liunx.
4:I like basketball
5:I like badminton ball ,billiard ball and chinese chess!
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
8:my WeChat is 13522828457
10:not 490000448.
11:my god ,i an not oldbey,but OlDEBOY!

在这里插入图片描述

扩展正则 egrep、grep -E 、 sed -r 、 awk

‘[ ]’ 正则表达式中,里面的特殊符号 . * | 没有特殊含义

+ 显示一个字符出现多次的行

[root@zheng ~]# egrep -n '2+' /zyf/jianli.txt 
8:my WeChat is 13522828457

在这里插入图片描述

也可以’[a-Z]’
只可以在egrep/grep中使用,其他的三剑客没法用

[root@zheng ~]# egrep -n '[a-Z]+' /zyf/jianli.txt 
1:I am student!
2:I like Liunx.
4:I like basketball
5:I like badminton ball ,billiard ball and chinese chess!
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
8:my WeChat is 13522828457
10:not 490000448.
11:my god ,i an not oldbey,but OlDEBOY!

在这里插入图片描述

删除空行或者只有空格的行

少了第一行和第四行

[root@zheng ~]# sed -r '/^$|^ +$/d' kong |cat -An 
     1  a $
     2  a$
     3    s$
     4   s $
     5   s$

让选中的行以单词的形式排列

在最后加一个-o参数

[root@zheng ~]# egrep -n '[a-Z]+' /zyf/jianli.txt -o
1:I
1:am
1:student
2:I
2:like
2:Liunx
4:I
4:like
4:basketball
5:I
5:like
5:badminton
5:ball
5:billiard
5:ball
5:and
................

在这里插入图片描述

| 或者

显示blog和my的行

[root@zheng ~]# egrep -n 'blog|my' /zyf/jianli.txt       
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
8:my WeChat is 13522828457
11:my god ,i an not oldbey,but OlDEBOY!

排除#和空行

-v 反选
‘#|^$’ #和空行

[root@zheng ~]# egrep -vn '#|^$' /zyf/jianli.txt 
1:I am student!
2:I like Liunx.
4:I like basketball
5:I like badminton ball ,billiard ball and chinese chess!
6:my blog is http://oldboy.blog.51cto.com
7:our size is http://blog.oldoyedu.com
8:my WeChat is 13522828457
10:not 490000448.
11:my god ,i an not oldbey,but OlDEBOY!

在这里插入图片描述

( ) 表示一个整体 反向引用/后向引用(sed)grep和egrep很少用

这句话如果写全的话是 ‘oldboy|oldbey’
但是这样很麻烦,因为前面的都一样,所以就可以用在后面用小括号括起来

[root@zheng ~]# egrep -n 'oldb(oy|ey)' /zyf/jianli.txt 
6:my blog is http://oldboy.blog.51cto.com
11:my god ,i an not oldbey,but OlDEBOY!

在这里插入图片描述

sed小括号使用,在字符边添加内容

先输出12345
通过管道命令传到sed来替换 s#原本内容#要替换的内容#g
用.*代表所有字符,把他用小括号保护起来
后面的 \1 代表第一个小括号内容,可以在两边加上符号什么的
sed 要加-r参数

   -r, --regexp-extended
          use extended regular expressions in the script.
   -r、 --regexp扩展
          在脚本中使用扩展正则表达式。

这样可以通过sed命令添加括号或者别的符号

[root@zheng ~]# echo '12345'
12345
[root@zheng ~]# echo 12345 | sed 's#(.*)#<\1>#g'
sed: -e expression #1, char 13: invalid reference \1 on `s' command's RHS

[root@zheng ~]# echo 12345 | sed -r 's#(.*)#<\1>#g'
<12345>

也可用用点来从原本字符的中间开始加
一个点代表一个字符
如果字符不一样的话会出错
像下面一样把34用尖括号括起来
然后再选第六个字符不加东西
撬棍加数字就代表是第几个括号里的内容
\4就是第四个括号,不过现在没有这么多,只做了两个

[root@zheng ~]# echo 123456 |sed -r 's#..(..)....#<\1>#g'
123456
[root@zheng ~]# echo 123456 |sed -r 's#..(..)..#<\1>#g'  
<34>

[root@zheng ~]# echo 123456 |sed -r 's#..(..).(.)#<\1>\2#g'
<34>6
sed小括号使用,添加内容以后重定向到文件
[root@zheng ~]# echo 123456 |sed -r 's#..(..).(.)#<\1>\2#g' >sed.txt 
[root@zheng ~]# nl sed.txt 
     1  <34>6
小括号的灵巧应用
[root@zheng ~]# echo '123456' |sed -r 's#(.)#<\1>#g'
<1><2><3><4><5><6>
[root@zheng ~]# echo '123456' |sed -r 's#([1-3])#<\1>#g'
<1><2><3>456
[root@zheng ~]# echo '123456' |sed -r 's#([1|5])#<\1>#g'
<1>234<5>6

{} 指定出现多少次 匹配正确的身份证号

[root@zheng ~]# vi test.txt
金 211324198415244720500224197105168312646461asd
任 123123123zyf
任 linux6543454345354
任 j516515615635433
任 50182197306dagasdd
吕 21128219920911303X
空 15000001932111261125513321513152513119264611813621162X
杜 11010151351332153x
[root@zheng ~]# egrep '[0-9]{18}|[0-9]{17}X' test.txt 
金 21132419841524472050022419710516831221128219920911303X
空 15000001932111261125513321513152513119264611813621162X
[root@zheng ~]# egrep '[0-9X]{18}' test.txt 
金 21132419841524472050022419710516831221128219920911303X
空 15000001932111261125513321513152513119264611813621162X
[root@zheng ~]# egrep '[0-9]{17}[0-9X]' test.txt    
金 21132419841524472050022419710516831221128219920911303X
空 15000001932111261125513321513152513119264611813621162X

ERE小结

1、+一般[]进行配合 把各种连续的东西取出来
2、 | 或
3、() 一个整体 ,后向引用 -sed
4、()0{n,m} 前一个字符至少连续出现了n次,最多连续出现了m次
5、?前一个字符连续出现0次或1次

sed命令把ip取出来

查询ip的两种方式
1、查询关键词 /inet /p
2、打印行数 3p

过滤inet发现有个inet6一起显示了,第一行后面有空格不是数字,所以加上一个空格就好了
[root@zheng ~]# ip add show ens33 |sed -n '/inet/p'
    inet 192.168.100.10/24 brd 192.168.100.255 scope global ens33
    inet6 fe80::299c:3370:1a37:a22d/64 scope link 
[root@zheng ~]# ip add show ens33 |sed -n '/inet /p'
    inet 192.168.100.10/24 brd 192.168.100.255 scope global ens33
    
显示第三行    
[root@zheng ~]# ip add show ens33 |sed -n '3p'  
    inet 192.168.100.10/24 brd 192.168.100.255 scope global ens33

这里是挨个测试,最后一步才是正确答案
s#后面的 ^.*t
从开头所有字符一直到t,这里注意.的贪婪性,如果后面也有t的话会直接跳到最后一个匹配到的字符上去,可以加一个空格
后面的(.
)就是你要显示的内容,直接让他全部显示
由于只显示ip,所以ip后面的/24不要了,就直接在括号后面写上/
然后后面写.*所有字符一直到结尾$
后面要替换成\1
就是显示第一个括号的内容

[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t (.*)/##g'   
24 brd 192.168.100.255 scope global ens33
[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t (.*)/.*$##g'

[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t (.*)/.*$#\(1)#g'
(1)
[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t (.*)/.*$#\(\)#g'
()
[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t (.*)/.*$#\()#g' 
()
[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t (.*)/.*$#\1()#g'
192.168.100.10()
[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t (.*)/.*$#\1#g'  
192.168.100.10

连ip带掩码一起显示

[root@zheng ~]# ip add show ens33 |sed -n '3p'|sed -r 's#^.*t(.*)brd.*$#\1#g'
 192.168.100.10/24 

正则表达式总结

1、egrep/grep 简单了解,看看效果,结果
2、egrep/grep -o 参数看正则到底匹配了什么
3、多练,配合grep,egrep,sed -r,awk

基础正则和扩展正则的区别

BRE(基础正则)^ $ ^$ . * .* [ ] [^]
ERE(扩展正则)+ | () {} ?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值