命令行通配符文件搜索工具grep,sed,awk
正则表达式多用在文件内容上,比如grep,awk,sed等文本过滤工具
通配符多用在文件名上,比如find,ls,cp,mv等
正则表达式
由特殊的字符或者文件编写的模式,其中的字符和文本并不是字面意思,而是表示控制或者通配功能
分类
基本正则表达式 BRE
1.字符匹配
匹配任意单个字符 .
匹配范围内的任意单个字符 []
匹配范围外的任意单个字符 [^]
匹配任意单个字母 [[:alpha:]]
匹配任意单个数字 [0-9] [[:digit:]]
匹配任意单个字母或数字 [0-9a-z] [[:alnum:]]
匹配所有大写字母 [[:upper:]]
匹配所有小写字母 [a-z] [[:lower:]]
匹配标点符号 [[:punct:]]
匹配空白字符 [[:space:]]
2.匹配次数
匹配其前面的任意字符任意次数(0次、1次、多次)*
匹配任意长度的任意字符 .*
匹配其前面的字符至多1次(0次、1次)\?
匹配其前面的字符至少1次(1次、多次)\+
匹配其前面字符m次 \{m\}
匹配其前面字符至少m次至多n次 \{m,n\}
匹配其前面字符至多n次 \{0,n\}
匹配其前面字符至少m次 \{m,\}
练习
准备文件
[root@localhost ~]# cat a.txt
abxy
aby
xxxxxy
yab
演示
[root@localhost ~]# grep x*y a.txt
abxy
aby
xxxxxy
yab
[root@localhost ~]# grep "x\?y" a.txt
abxy
aby
xxxxxy
yab
[root@localhost ~]# grep "x\+y" a.txt
abxy
xxxxxy
[root@localhost ~]# grep "x\{1\}y" a.txt
abxy
xxxxxy
3.位置锚定
行首锚定 ^
行尾锚定 $
PATTERN匹配整行 ^pattern$
空白行 ^$
空行或包含空白字符的行 ^[[space]]*$
单词:非特殊字符组成的连续字符(字符串)都称为单词
词首锚定 \<
或 \b
词尾锚定 \>
或 \b
匹配完整单词 \<pattern\>
练习
(1)显示/etc/passwd文件中不以/bin/bash结尾的行grep -v "/bin/bash$" /etc/passwd
(2)找出/etc/passwd文件中的两位数或三位数grep "\<[0-9]\{2,3\}\>" /etc/passwd
不要忘记词首锚定和词尾锚定!
[root@zycentos7 ~]# grep -n "\<[0-9]\{2,3\}\>" /etc/passwd
[root@zycentos7 ~]# grep -n "[0-9]\{2,3\}" /etc/passwd
3)找出/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
4)找出ifconfig中的ip地址
ifconfig ens33 | grep -Eo "(\<[0-9]{1,3}\>\.){3}\<[0-9]{1,3}\>" | head -1
4.分组及引用(后项引用)
\(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理
\(abc\)\(123\)\(ybc\) 命令行中括号有特殊意义所以用转义符
分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符 abc
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符 123
\3:模式从左侧起,第三个左括号以及与之匹配的右括号之间的模式所匹配到的字符 456
经典示例1
[root@localhost tmp]# cat file1
He loves his lover.
He likes his lover.
She likes her liker.
She lover her liker.
[root@localhost tmp]# grep "\(l..e\).*\1" file1
He loves his lover.
She likes her liker.
经典示例2
[root@zycentos7 ~]# cat test001.txt
id name score
1 liming 1
2 zhangkai 2
3 taotao 100
扩展正则表达式 ERE
扩展正则表达式与基本正则表达式基本相同,用法相似,除了词首、词尾锚定一样,其他只是在基本正则表达式中去掉转义字符
与基本正则表达式的比较:写法上比较简单,去掉了大量的转义字符;但需要匹配特殊字符时,扩展正则表达式需将特殊字符用 [ ] 括起来使用,这时用基本正则表达式比较方便。
分类 | 表达式 | 含义 |
字符匹配 | . | 任意单个字符 |
[ ] | 指定范围内的任意单个字符 | |
[^] | 指定范围内的任意单个字符 | |
匹配次数 | * | 任意次:0,1或多次 |
? | 0次或者1次 | |
+ | 其前字符至少出现1次 | |
{m} | 其前的字符出现m次 | |
{m,n} | 至少m次,至多n次 | |
{0,n} | 至多n次 | |
{m,} | 至少m次 | |
位置锚定 | ^ | 行首锚定 |
$ | 行尾锚定 | |
<,\b | 词首锚定 | |
>,\b | 词尾锚定 | |
分组及引用 | () | 括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中 |
()…\1 | 引用 | |
a|b | a或者b |
示例
[root@zycentos7 ~]# cat d
lllove
linux
move
love
llove