Linux正则表达式
正则表达式是什么
正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以用户轻易达到查找、删除、替换特定字符串的处理程序。
正则表达式和通配符
通配符(wtilcard):是bash操作接口的一个功能。例如:ls、find、cp
正则表达式:是一种字符串处理的表达方式。例如:vi、grep、awk、sed等工具
基础正则表达式字符
RE字符 | 意义 | 例子 |
^word | 待查找的字符串 | grep -n ‘^#’ test.txt |
word$ | 待查找的字符串在行尾 | grep -n ‘!$’ test.txt |
. | 代表一定有一个任意字符的字符 | grep -n ‘e.e’ test.txt |
\ | 转义字符,将特殊符号的特殊意义去除 | grep -n \’ test.txt |
* | 重复零个到无穷多个的前一个字符 | grep -n ‘ess*’ test.txt |
[list] | 从字符集合的字符里面找出想要选取的字符 | grep -n ‘g[ld]’ test.txt |
[n1-n2] | 从字符集合的字符里面找出想要选取的字符范围 | grep -n ‘[0-9]’ test.txt |
[^list] | 从字符集合字符里面找出不要的字符串或范围 | grep -n ‘oo[^t]’ test.txt |
\{n,m\} | 连续n到m个的前一个字符 | grep -n ‘go\{2,3\}g’ test.txt |
[注1]:在通配符中的*代表的是零到无限多个字符的意思,但在正则表达式中,*则是重复0到无穷多个的前一个字符的意思。
[注2]:正则表达式中包含?、*、+、{、}、(、)、等符号时,必须使用反斜杠(“\”)转义。但是<>符号不需要转义。
扩展型正则表达式
RE字符 | 意义 | 例子 |
+ | 重复一个或一个以上的前一个RE字符 | egrep -n ‘go+d’ test.txt |
? | 零个或一个的前一个RE字符 | egrep -n ‘go?d’ test.txt |
| | 用或(or)的方式找出数个字符串 | egrep -n ‘gd|dood’ test.txt |
() | 找出“组”字符串 | egrep -n ‘g(la|oo)d’ test.txt |
()+ | 多个重复组的判别 | echo ‘AxyzxyzC’ | egrep ‘A(xyz)+C’ test.txt |
特殊符号
特殊符号 | 代表意义 |
[:alnum:] | ASCII码从33~126之间的可打印字符 |
[:alpha:] | 小写及大写字母,等价于[a-zA-Z] |
[:blank:] | 代表空格键与[Tab]键 |
[:cntrl:] | 控制按键,包括CR、LF、Tab、Del |
[:digit:] | 数字0~9,等价于[0-9] |
[:graph:] | 除了空格符(空格键和[Tab])以外的其他按键 |
[:lower:] | 小写字母,等价于[a-z] |
[:print:] | 代表任何可以被打印出来的字符 |
[:upper:] | 大写字母,等价于[A-Z] |
[:space:] | 空白字符,包括空格、水平制表符、垂直制表符、换行、换页、回车 |
[:xdigit:] | 十六进制字符,等价于[a-fA-F0-9] |
Awk内置变量
变量名称 | 代表的意义 |
NF | 每行($0)拥有的字段总数 |
NR | 目前awk所处理的时“第几行”数据 |
FS | 目前的分和服,默认时空格键 |
常用正则表达式
[匹配并修改IP地址]
1)IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”
2)IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数
例如:将addr文件中IPADDR=192.168.25.23修改成IPADDR=192.168.25.100
方法一:
sed 's/\(IPADDR=\(\(25[0-5]\|2[0-4][0-9]\|\<1\?[0-9][0-9]\?\)\.\)\{3\}\).*/\1100/'reg.txt
方法二:
sed 's/\(IPADDR=\(\(25[0-5]\|2[0-4][0-9]\|1[0-9][0-9]\|[1-9][0-9]\|[0-9]\)\.\)\{3\}\).*/\166/'reg.txt
[匹配邮箱]
1)邮箱完整地址由用户名@域名组成
2)用户名最少三个字符,由由字母、数字、下划线组成,字母不区分大小写
3)域名应至少有一个 . 分隔,分隔的各部分至少2个字符,可能由字母、数字组成
例如:找着类似25642564qq.com
egrep '[0-Z_]{3,}@[0-Z]{2,}(\.[0-Z]{2,})+' reg.txt
grep '[0-Z_]\{3,\}@[0-Z]\{2,\}\.[0-Z]\{2,\}' reg.txt
[匹配MAC地址]
1)MAC地址由12个16进制的字母组成
2)16个字母是0~9、a~f 。不区分大小写,一般为大写
3)每两个字母为一组,共六组,每组间用冒号:隔开
例如:找到类似 00:0C:29:88:83:1A
egrep '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}' text.txt
grep '[0-9a-fA-F]\{2\}\(:[0-9a-fA-F]\{2\}\)\{5\}' text.txt
[去除空白行与首行为#的行列]
grep -v '^$' text.txt | grep -v '^#'