(十)正则表达式
正则表达式(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:] | 代表space 和Tab 按键 |
[: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 | grep [-acinv] [--color=auto] '查找字符' filename |
使用前请将语系设置为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 | grep '^[a-z]' 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 |
() |
里面是一个群组,可以与|结合使用 |
()+ |
重复的群组 |