正则表达式
基本正则表达式
注: 本文路径有可能不一样test和tmp(懒)
//元字符
. //任意单个字符
[] //匹配指定范围内的任意单个字符
[^] //匹配指定范围外的任意单个字符
[root@localhost test]# ls
aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc caa cab cac cba cbb cbc cca ccb ccc
aaa1 aab1 aac1 aba1 abb1 abc1 aca1 acb1 acc1 baa1 bab1 bac1 bba1 bbb1 bbc1 bca1 bcb1 bcc1 caa1 cab1 cac1 cba1 cbb1 cbc1 cca1 ccb1 ccc1
aaa2 aab2 aac2 aba2 abb2 abc2 aca2 acb2 acc2 baa2 bab2 bac2 bba2 bbb2 bbc2 bca2 bcb2 bcc2 caa2 cab2 cac2 cba2 cbb2 cbc2 cca2 ccb2 ccc2
aaa3 aab3 aac3 aba3 abb3 abc3 aca3 acb3 acc3 baa3 bab3 bac3 bba3 bbb3 bbc3 bca3 bcb3 bcc3 caa3 cab3 cac3 cba3 cbb3 cbc3 cca3 ccb3 ccc3
[root@localhost test]# ls |grep a.c # a加任意字符加c
aac
aac1
aac2
aac3
abc
abc1
abc2
abc3
acc
acc1
acc2
acc3
[root@localhost test]# ls |grep a'[b-c]'c #a加b到c加c
abc
abc1
abc2
abc3
acc
acc1
acc2
acc3
[root@localhost test]# ls|grep 'ab[^c]' #匹配前面是ab后面不接c的所有
aab1
aab2
aab3
aba
aba1
aba2
aba3
abb
abb1
abb2
abb3
bab1
bab2
bab3
cab1
cab2
cab3
[root@localhost test]# ls|grep '^ab[^c]' #锚定ab在开头后面不是c的所有
aba
aba1
aba2
aba3
abb
abb1
abb2
abb3
匹配次数(贪婪模式)
* //匹配其前面的任意单个字符任意次
.* //任意长度的任意字符
\? //匹配其前面的任意单个字符1次或0次
\+ //匹配其前面的任意单个字符至少1次
\{m,n\} //匹配其前面的任意单个字符至少m次,至多n次
- 匹配任意次数a结尾文件
[root@localhost test]# ls|grep 'a\{1,3\}$'
aaa
aba
aca
baa
bba
bca
caa
cba
cca
- 匹配ab加任意字符的任意次数b加1的文件(同一个字符任意次数)
[root@localhost tmp]# ls |grep '^ab.*1$'
aba1
abb1
abc1
- 匹配 至少一次a加c的件
[root@localhost test]# ls |grep '^a\+c'
aac
aac1
aac2
aac3
aca
aca1
aca2
aca3
acb
acb1
acb2
acb3
acc
acc1
acc2
acc3
定位过滤
//位置锚定
^ //锚定行首,此字符后面的任意单个字符必须出现在行首
$ //锚定行尾,此字符前面的任意单个字符必须出现在行尾
^$ //空白行
\<或\b //锚定词首,其后面的任意单个字符必须作为单词首部出现
\>或\b //锚定词尾,其前面的任意单个字符必须作为单词尾部出现
- 匹配以a开头以c结尾的中间只有一个b的文件
[root@localhost tmp]# ls
a aaabbbc aabc ab ab2c abbbc abc acb2c bba
aaaabbbbc aabbc aac ab22c abb abbc ac acc
[root@localhost tmp]# ls |grep '^abc$'
abc
- 匹配a开头以b结尾的文件
//多种方法看自己喜好吧
[root@localhost tmp]# ls
a aaabbbc aabc ab ab2c abbbc abc acb2c bba
aaaabbbbc aabbc aac ab22c abb abbc ac acc
[root@localhost tmp]# ls |grep '\bab\b'
ab
[root@localhost tmp]# ls |grep '^ab$'
ab
[root@localhost tmp]# ls |grep '\<ab\>'
ab
分组
/分组
\(\)
例:\(ab\)*
//后向引用
\1 //引用第一个左括号以及与之对应的右括号所包括的所有内容
\2 //引用第二个左括号以及与之对应的右括号所包括的所有内容
扩展正则表达式
//字符匹配
. //匹配任意单个字符
[] //匹配指定范围内的任意单个字符
[^] //匹配指定范围外的任意单个字符
- 匹配a开头加一个任意字符加bc结尾的文件
[root@localhost tmp]# ls
a aaabbbc aabc ab ab2c abbbc abc acb2c bba
aaaabbbbc aabbc aac ab22c abb abbc ac acc
[root@localhost tmp]# ls |grep -E '^a.bc$'
aabc
abbc
- 匹配a加小写字母加c的文件
[root@localhost tmp]# ls
a aaabbbc aabc ab ab2c abbbc abc acb2c bba
aaaabbbbc aabbc aac ab22c abb abbc ac acc
[root@localhost tmp]# ls |grep -E '^a[a-z]c$'
aac
abc
acc
- 匹配ab加不是小写字母的字符加c文件
[root@localhost tmp]# ls
a aaabbbc aabc ab ab2c abbbc abc acb2c bba
aaaabbbbc aabbc aac ab22c abb abbc ac acc
[root@localhost tmp]# ls |grep -E '^ab[^a-z]c$'
ab2c
次数匹配
//次数匹配
* //匹配其前面的任意单个字符任意次
? //匹配其前面的任意单个字符1次或0次
+ //匹配其前面的任意单个字符至少1次
{m,n} //匹配其前面的任意单个字符至少m次,至多n次
- 匹配a加任意次数的b加c文件
[root@localhost tmp]# ls
a aaabbbc aabc ab ab2c abbbc abc acb2c bba
aaaabbbbc aabbc aac ab22c abb abbc ac acc
[root@localhost tmp]# ls |grep -E '^ab*c$'
abbbc
abbc
abc
ac
- 匹配a加1次或0次的b的文件
[root@localhost tmp]# ls
a aaabbbc aabc ab ab2c abbbc abc acb2c bba
aaaabbbbc aabbc aac ab22c abb abbc ac acc
[root@localhost tmp]# ls |grep -E '^ab?c$'
abc
ac
- 匹配a加1以上次数b加次的文件
[root@localhost tmp]# ls
a aaabbbc aabc ab ab2c abbbc abc acb2c bba
aaaabbbbc aabbc aac ab22c abb abbc ac acc
[root@localhost tmp]# ls |grep -E '^ab+c$'
abbbc
abbc
abc
- 匹配a加3到4次的b加c的文件
[root@localhost tmp]# ls
a aaabbbc aabc ab ab2c abbbc abc acb2c bba
aaaabbbbc aabbc aac ab22c abb abbc ac acc
[root@localhost tmp]# ls |grep -E '^ab{3,4}c$'
abbbc
锚定匹配
//位置锚定
^ //锚定行首,此字符后面的任意单个字符必须出现在行首
$ //锚定行尾,此字符前面的任意单个字符必须出现在行尾
^$ //空白行
\<或\b //锚定词首,其后面的任意单个字符必须作为单词首部出现
\>或\b //锚定词尾,其前面的任意单个字符必须作为单词尾部出现
- 匹配以a为行首b为行尾的文件
[root@localhost tmp]# ls
a aaabbbc aabc ab ab2c abbbc abc acb2c bba
aaaabbbbc aabbc aac ab22c abb abbc ac acc
[root@localhost tmp]# ls |grep -E '^ab$'
ab
[root@localhost tmp]# ls |grep -E '\<ab\>'
ab
[root@localhost tmp]# ls |grep -E '\bab\b'
ab
//分组
() //分组
\1,\2,\3,....
例:(ab)*
//后向引用
\1 //引用第一个左括号以及与之对应的右括号所包括的所有内容
\2 //引用第二个左括号以及与之对应的右括号所包括的所有内容
//或者
| //or 默认匹配|的整个左侧或者整个右侧的内容
//例:C|cat表示C或者cat,要想表示Cat或者cat则需要使用分组,如(C|c)at
- 匹配以任意次数ab加c的文件
[root@localhost tmp]# ls
a aaabbbc aabc ab ab2c ababc abbbc abc acb2c bba
aaaabbbbc aabbc aac ab22c abababc abb abbc ac acc
[root@localhost tmp]# ls |grep -E '^ab*c$'
abbbc
abbc
abc
ac
[root@localhost tmp]# ls |grep -E '^(ab)*c$'
abababc
ababc
abc
- 好玩的实例
[root@localhost tmp]# echo '天下无双 雄霸天下 纵横天下' |sed -r 's/天下无双 (.*) (.*)/天下无双 \2 \1 /g'
天下无双 纵横天下 雄霸天下
- 小技巧
# 过滤纯IP行,不要觉得没用,在处理日志时非常有用, -v 取反
grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}'
# 过滤网段, 同理 -v 取反
grep -E '192\.168\.213\.[0-9]{1,3}' # 24位掩码
grep -E '192\.168\.[0-9]{1,3}.[0-9]{1,3}' #16位掩码 8位同理