正则表达式
1、正则表达式分类
正则表达式 | 符号 |
---|---|
基础正则BRE (Basic RE) | ^ $ . * .* [] [^] \ |
扩展正则ERE (Extended RE)121 | + () {} ? |
Perl语言正则(其他) |
2、基础正则
2.1 ^ 以…开头的行
grep '^m' re.txt #以m开头的行
2.2 $ 以…结尾的行
grep '8$' re.txt #以8结尾的行
cat -A 显示出文件中的特殊隐藏符号
2.3 ^$ 空行
grep -n '^$' re.txt #过滤出文件中的空行并显示行号
grep -nv '^$' re.txt #排除空行
2.4 . 任意一个字符,不匹配空行
grep 'oldb.y' re.txt
grep -o #显示匹配过程
2.5 \ 转义字符,脱去马甲,打回原形,去掉符号的特殊含义
grep '\.' re.txt #匹配所有的点
2.6 * 前一个字符连续出现0次或0次以上
grep '0*' re.txt
2.7 .* 一个组合,代表任意字符
grep '^.*am' re.txt #找到以任意字母开头,知道匹配到am的行
grep '^.*o' re.txt #正则表示连续出现的时候或者表示所有的时候,正则体现出贪婪性,尽可能多的匹配
2.8 [] 表示匹配任意一个字符
grep -o '[abc]' re.txt #一个字母一个字母的匹配,匹配所有的abc
grep -o '[abc][abc]' re.txt #匹配任意两个字母的组合,比如ab/ac/ba/bc/ca/cb
[0-9] #匹配0-9的数字
[a-z] #匹配所有的小写字母
[A-Z] #匹配所有的大写字母
[a-Z] #匹配所有的英文字母,用不了就用[a-zA-Z]
grep '^[mn]' re.txt #匹配以m或n开头的行
grep '^mn' re.txt #匹配以mn开头的行
grep '[.! ]$' re.txt #匹配以./!/空格结尾的行
grep -o 显示匹配过程
[]会自动去掉符号的特殊含义,不需要使用\进行转义,多与+配合使用
2.9 [^] 相当于取反,排除括号里的内容
grep '[^good]' re.txt #排除g/o/d/good 这样的字符,取剩下的
3、扩展正则
grep使用-E参数或者egrep支持扩展正则
sed使用-r参数支持扩展正则
awk默认支持扩展正则
3.1 + 前一个字符连续出现1次或一次以上
egrep '[0-9]+' re.txt #取出数字
egrep '[a-Z]+' re.txt #取出单词
3.2 | 或者
egrep 'oldboy|linux' re.txt #匹配oldboy或linux的行
egrep -v '^$|^#' /etc/ssh/sshd_config #排除空行和注释掉的行
or
grep '^[a-Z]' /etc/ssh/sshd_config
3.3 () 表示一个整体,用于后向引用(sed反向引用)
rpm -qa |egrep '^tree|^sl|^vim' #检查tree/vim/sl是否安装
使用()可以方便些
rpm -qa |egrep '^(tree|sl|vim)'
3.4 {} a{n,m} 前一个字符最少出现n次,最多出现m次
格式 | 说明 |
---|---|
a{n,m} | 前一个字符最少出现n次,最多出现m次 |
a{n} | 前一个字符连续出现n次 |
a{n,} | 前一个字符最少出现n次 |
a{,m} | 前一个字符最多出现m次 |
egrep '0{1,4}' re.txt #匹配0最少出现1次,最多出现4次的行
egrep '[0-9]{17}[0-9X]$' #匹配身份证号
3.5 ? 前一个字符出现0次或1次
egrep 'go?d' good
不常用
4、Perl部分正则表达式
grep使用-P参数
符号 | 说明 |
---|---|
\d | [0-9] |
\D | [^0-9] |
\s | 匹配的空字符 空格 tab |
\S | 与\s相反 |
\w | [0-9a-zA-Z_] 等价于[_[:alnum]] |
\W | 与\w相反 |
\b | 匹配单词边界 |
\t | 空格 |
\n | 回车 |
\f | tab回车tab |