Linux 正则表达式

62 篇文章 3 订阅
52 篇文章 1 订阅

Linux grep 命令详解 (正则表达式)

主要内容

  • 查找
  • 取出
  • 匹配

查找、取出、匹配复符合条件的摸个字符或字符串

体验
sudo grep 'nameserver' /var/log/syslog

正则表达式单字符

  • 特定字符
  • 范围内字符
  • 任意字符
某个具体字符
grep root /etc/passwd
grep lhz /etc/passwd
grep nginx /etc/passwd
grep 'usr' centos8编译安装nginx.txt
单引号和双引号

单引号:可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。单引号’'是全引用,被单引号括起的内容不管是常量还是变量者不会发生替换。

双引号:把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。双引号""是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容。

不加引号:不会将含有空格的字符串视为一个整体输出, 如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用。

使用规则:一般常量用单引号’'括起,如果含有变量则用双引号""括起。

最大不同:单引号与双引号的最大不同在于双引号仍然可以保有变数的内容,但单引号内仅能是一般字元,而不会有特殊符号

使用举例:
"“号里面遇到KaTeX parse error: Undefined control sequence: \等 at position 2: ,\̲等̲特殊字符会进行相应的变量替换 …a” file #引用变量a,查找变量a的值
grep 'KaTeX parse error: Expected 'EOF', got '#' at position 17: …' file #̲查找“a”字符串
grep “\” file #grep: Trailing backslash(不知原因)
grep ‘\’ file #查找‘\’字符

1、$ 美元符
2、\ 反斜杠
3、` 反引号
4、" 双引号
这四个字符在双引号中是具有特殊含义的,其他都没有,而单引号使所有字符都失去特殊含义
如果用双引号,查找一个\,就应该用四个:
grep “\\” file 这样就对了,这样等同于:
grep ‘\’ file
第一条命令shell把四个,转义成2个\传递给grep,grep再把2个\转义成一个\查找
第二条命令shell没转义,直接把2个\传递给grep,grep再把2个\转义成一个\查找
其实grep执行的是相同的命令
还有一种情况是查找的内容含有单引号,也含有变量如 H O M E , 如文件: " HOME,如文件: " HOME,如文件:"HOME’
这时候 grep ‘"$HOME’‘的话,因为内容有单引号,第一个单引号会和倒数第二个单引号匹配,导致找不到正确内容,这里只能用双引号(如有单引号方法可以留言讨论),即grep “”$HOME’"。
结论:当grep的字符串中有单引号时,需要使用双引号,以防止单引号匹配错误。但这也会导致不想转换的变量被双引号转换,只能用\转义。

常用选项
-E :开启扩展(Extend)的正则表达式,相当于egrep
-e:同时匹配多个目标
-i :忽略大小写(ignore case)
-v:反向查找(invert),只打印没有匹配的,而匹配的反而不打印。
-n:显示行号
-i:忽略大小写
-c:显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。
-P:使用兼容perl的正则
-w:被匹配的文本只能是单词,而不能是单词中的某一部分,也就是精确匹配。如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker
fgrep: 不支持正则表达式,只能匹配写死的字符串,但是速度奇快,效率高,fastgrep
-o:只显示被模式匹配到的字符串。
-q:静默模式,只关心有没有匹配到,不关心内容
--color :将匹配到的内容以颜色高亮显示,centos7默认已经高亮。
-A n:显示匹配到的字符串所在的行及其后n行,after
-B n:显示匹配到的字符串所在的行及其前n行,before
-C n:显示匹配到的字符串所在的行及其前后各n行,context
去除空行;去除注释行;去除空行和注释行
grep -v '^$' abc.txt
grep -v '^#' abc.txt
egrep -v '^$|^#' abc.txt 或 grep -Ev '^$|^#' abc.txt 或 grep -Ev "^$|^[#;]" abc.txt
正则表达式的() [] {}
正则表达式的() [] {} 有着不同的意思。

() 是为了提取匹配字符串的,表达式中有几个()就有几个相应的匹配字符串

(\s*)表示连续空格的字符串

[] 是定义匹配的字符范围。比如[a-zA-Z0-9]表示相应位置的字符要匹配英文字符和数字。[\s*] 表示空格或者*号

{}一般是用来匹配的长度。比如\s{3}表示匹配三个空格,\s{1,3}表示匹配1到3个空格

(0-9)匹配'0-9'本身。[0-9]*匹配数字(注意后面有*,可以为空)[0-9]+匹配数字(注意后面有+,不可以为空){0-9}写法是错误的

[0-9]{0,9}表示长度为0到9的数字字符串。

 
圆括号()是组,主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理
示例:

1(abc|bcd|cde),表示这一段是abc、bcd、cde三者之一,顺序也必须一致

2(abc)? 表示这一组要么一起出现,要么不出现,出现那则按顺序出现

3(?:abc)表示找到一样abc的一组,但是不记录,不保存到变量中,否则可以通过变量中,否则可以通过x取第几个括号所匹配道德项

,比如:

(aaa)(bbb)(ccc)(?:ddd)(eee)可以用1获取(aaa)匹配到的内容,而1获取(aaa)匹配到的内容,而3则获取到了(ccc)匹配到的内容,而$4则获取的是由(eee)

匹配到的内容,因为前一对括号没有保存变量

4.a(?=bbb)顺序环视 表示a后面必须紧跟3个连续的b

5(?i:xxxx)不区分大小写   (?s:.*)跨行匹配,可以匹配回车符

 
方括号是单个匹配 字符集/排除字符集/命名字符集
示例:

1[0-3],表示找到一个位置上的字符只能是0到3折四个数字,与(abc|bcd|cde)的作用比较类似,但圆括号可以匹配多个连续的字符

而一对方括号只能匹配单个字符

2[^0-3] 表示找到这个位置上字符只能是除了0到3之外的所有字符

3[:digit:] 0-9 [:alnum] A-Za-z0-9

 

()[]有本质的区别

()内的内容表示的是一个表达式,()本身不匹配任何东西,也不惜那是匹配任何东西,只是把括号内的内容作为

同一个表达式来处理,例如(ab){1,3},就表示ab一起连续出现最少1次,最多三次。如果没有括号的话,ab{1,3},

就表示a 后面紧跟的b出现的最少一次,最多三次。另外,括号在匹配模式中也跟重要。这个就不延伸了。

[]表示匹配字符在[]中,兵出现一次,并且reshuffle字符写在[]会被当成普通字符来匹配,例如[(a)],会匹配(、a、)、这三个字符。

所以()[] 无论是作用还是表示的含义。都有天壤之别,没有什么联系。
grep的规则表达式
\ 转义字符:如"\"\""表示匹配""
[ - ] 匹配一个范围,[0-9a-zA-Z]匹配所有数字和字母
* 所有字符,长度可为0
+ 前面的字符出现了一次或者多次
^ #匹配行的开始 如:'^grep'匹配所有以grep开头的行。
$ #匹配行的结束 如:'grep$'匹配所有以grep结尾的行。
. #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
* #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
.* #一起用代表任意字符。
[] #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^] #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
\(..\) #标记匹配字符,如'\(love\)',love被标记为1。
\< #到匹配正则表达式的行开始,如:'\<grep'匹配包含以grep开头的单词的行。
\> #到匹配正则表达式的行结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\} #重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。
x\{m,\} #重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
x\{m,n\} #重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
\w #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b #单词锁定符,如: '\bgrep\b'只匹配grep。
内具体字符
数字字符:[0-9],[11]
grep '[0-9]' centos8编译安装nginx.txt
grep '[2-9]' centos8编译安装nginx.txt
grep '[0]' centos8编译安装nginx.txt
小写字符:[a-z]
grep '[a-z]' centos8编译安装nginx.txt
大写字符[A-Z]
grep '[A-Z]' centos8编译安装nginx.txt
反向字符:^
grep '[^0-9]' centos8编译安装nginx.txt
grep '^[0-9]' centos8编译安装nginx.txt
任意一个字符: .
grep 'm..e' centos8编译安装nginx.txt
# 本身含义就是找到含有点的支付
grep '[.]' centos8编译安装nginx.txt
# 转义与[.]相同
grep '\.' centos8编译安装nginx.txt
边界字符
头字符^
grep 'root' /etc/passwd
grep '^root' /etc/passwd
尾字符$
grep 'c++' centos8编译安装nginx.txt
grep 'c++$' centos8编译安装nginx.txt
空行^$
grep '^$' centos8编译安装nginx.txt
grep '^$' centos8编译安装nginx.txt | wc -l
元字符

代表普通字符或者特殊字符

任意字类字符:\w
grep '\w' centos8编译安装nginx.txt
任意非字类字符:\W
grep '\W' centos8编译安装nginx.txt
单词边界\b

单词边界 即单词开头或结尾

单词\b为单词结尾

\b单词为单词开头

grep 'berry' note.txt
grep 'berry\b' note.txt
grep '\bBlack' note.txt
正则表达式字符组合
零次或多次:*
一次或多次:+
零次或一次:?
正则表达式逻辑符号
  • |或
  • ^取反 注意与开始使用上的区别
grep 'bin/\(false\|true\)' /etc/passwd
案例
# 6-8位长度的QQ号
grep '^[0-9]\{6,8\}$' note.txt 
# 15或18位长度身份证 支持带X
grep '^[1-9]\([0-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$' note.txt 

note.txt

BlackberryBlue
Blueberry
berry

1234
12345
123456
1234567
12345678
123456789
12345678
1234567
123456
12345
1234

154180198803056797
46780519760812604X
910313198607147973
533068197207118491
51503119910515009X


#abc
##abc
abc#cba
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李昊哲小课

桃李不言下自成蹊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值