(十)正则表达式

正则表达式(regular expression)通过一定的规则进行查找、替换、删除字符,方便用户操作。作为一个系统管理员来说,正则表达式是一个非常好的查错方法,可以从非常长的日志文件中找到出问题的地方。正则表达式分为基础正则表达式和扩展正则表达式。想用正则表达式处理字符串,要使用支持正则表达式的程序,比如vim,sed,awk

基础正则表达式

1.语系对结果的影响

正则表达式就是处理字符串的一种方式,字符排序(语系)将影响搜索结果

  • LANG=C,字符排序是0,1,2…ABC…abc…
  • LANG=zh_CN,0123…aAbB…..

当我们使用[A-Z]搜索字符时,LANG=C会得到A-Z,LANG=zh-CN会得到Aa-Z的结果,所以语系不同,结果也不同

而为了避免这样编码造成的问题,有一些特殊符号可以解决

符号 代表意义
[:alnum:] 所有字母大小写和数字
[:alpha:] 任何字母大小写字符
[:blank:] 代表spaceTab按键
[:cntrl:] 代表控制按键,如CR,LF,Tab,Del等
[:digit:] 0-9
[:graph:] 除空格键以外的其他按键
[:lower:] a-z
[:print:] 任意可以被打印出来的字符
[:punct:] 标点符号(punctuation symbol)
[:upper:] A-Z
[:space:] 任意会产生空白的字符
[:xdigit:] 十六进制的数字类型0-9a-fA-F

下面进行实际操作

2.grep

grep支持正则表达式,先拿他演示一下

grep是以行为单位进行查找,删除的

语法

1
2
3
4
5
6
7
8
9
grep [-acinv] [--color=auto] '查找字符' filename
-a:将二进制文件以文本的形式查找数据
-c:计算‘查找字符’的数量
-i:忽略大小写
-n:输出行号
-v:反选
--color=auto:显示颜色
-A:后可接数字n,表示将本行加后n行显示出来
-B:后可接数字n,显示本行及前面n行

使用前请将语系设置为C

1
export LANG=C;export LC_ALL=C

查找规定字符串

1
grep 'string' filename

查找tast和test时,发现它们都是t?st的形式,可以这样查找

1
grep 't[ae]st' filename
  • []里面不管有多少字符,都仅代表一个字符(或)
  • [^]代表反选,[^a]代表不含a,[^a-z]&[^abcd..z]都代表不含小写字母的意思
  • 连续的字符可以这样表示:[0-9][a-z][A-Z]或者[0-9a-zA-Z]
  • [[:lower:]]即含有小写字母的意思

行首与行尾字符^,$

想查找以the开头的时使用

1
grep '^the' filename

查找以小写字母开头时

1
2
grep '^[a-z]' filename
grep '[[:lower:]]' filename

查找非小写字母开头

1
grep '^[^a-z]' filename

注意行尾的符号要看系统,wondows的换行符是^M$,Linux是^$

查找空白行(其实一般是将它反选)

1
grep '^$' filename	

删除注释(行首为#,如果直接是#的话会误删)

1
grep '^#' -v filename

任一字符.和重复字符*

  • .表示一定有一个任意字符
  • *表示重复前一个字符,0到无穷次

查找g??d

1
grep 'g..d' filename

查找god,good..即g与g中间含一个o到无数个o

1
grep 'goo*d' filename

查找开头是g结尾是g(g…g)

1
grep 'g.*g' filename

限定RE字符范围{}

*是0-无穷个,如果想限定范围呢,就要使用{},由于{}在shell下有其他意义(通配和替换),所以要使用\转义

查找2个o

1
grep 'o\{2\}' filename

查找2-5个o

1
grep ' \{2,5\}' filename

查找2个以上的o

1
grep 'o\{2,\}' filename

基础正则表达式字符集合

RE字符 意义
^word 行首是word
word$ 行末是word
. 任一字符
\ 转义字符
* 重复前一个字符从0到无穷多个
[list] 代表一个集合,取出一个字符
[n1-n2] 代表两字符中间的所有字符
[^list] 反选
\{n1,n2\} n1n2是数字,n1到n2个前一个字符

扩展正则表达式

扩展正则表达式也需要支持的程序才能执行,比如egrep(grep -E)

re字符 意义
+ 重复前一个字符1次或无穷次
? 重复前一个字符0-1个次
| or
() 里面是一个群组,可以与|结合使用
()+ 重复的群组
作者

manu

发布于

2020-01-23

更新于

2023-01-06

许可协议

# 相关文章
  1.(八)vim editer
# 推荐文章
  1.ALTER
  2.数据库笔记
  3.微信小程序笔记
  4.动态调试-OD
  5.winPE结构
  6.git指令

:D 一言句子获取中...