1、正则表达式
2、grep命令
一、正则表达式(regular expression)
写正则就是找规律
在正则表达式中 ^(表示以什么开头) $ (表示以什么结尾)
例如: ^aa 表示以aa开头的行
aa$ 表示以aa结尾的行
[] 表示一个字符集
[a-z] 从a - z 中取一个
[^a-z] 不取a-z的字符 在[]里 ^ 代表取反的意思
1、正则通配符
? 代表前一项匹配1次或0次
+ 代表前一项匹配1次以上
* 代表前一项匹配任意次
. 匹配单个字符单个字符
{n} 代表前一项 匹配n次
{n,} 代表前一项匹配n次以上
{n,m} 代表前一项匹配n--m次
例题:
1、查找出/etc/login.defs文件中的有效行(不显示空行和注释行)。
[root@lamp-test lianxi]# egrep -v "^$|^#" /etc/login.defs
2、查找出/var/log/messages文档中有16个字母的单词?
[root@lamp-test lianxi]# egrep "\b[a-Z]{16}\b" /var/log/messages-20211215
3、查找出来/etc/passwd文件里用户名包含liu同时使用bash的用户
[root@lamp-test lianxi]# egrep ".*liu.*bash.*" /etc/passwd
4、查找出/etc/ssh/sshd_config 文件里的包含连续2个数字的行
# egrep "\b[0-9]{2}\b" /etc/ssh/sshd_config
5、查找出包含特殊字符的行
egrep "[^0-Z]" /etc/ssh/sshd_config
6、查找出不包含数字的行
[root@lamp-test lianxi]# grep -v "[0-9]" /etc/ssh/sshd_config
7、写出匹配192.168.23.1的正则,第一段是192-223之间,后面的是0--255之间
思路分析:
192-223可以分三步走:1;192--199
2;200--219
3;220--223
结果:19[2-9]|2[01][0-9]|22[0-3]
0-255可以分五步走:1;0--9
2;10--99
3;100--199
4;200--249
5;250--255
结果:[1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]
综合得:(19[2-9]|2[01][0-9]|22[0-3])(\.([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}
二、grep命令
文本三剑客 ==> (awk grep sed)
-E 支持扩展正则,也可以写成(egrep)
-i 查找时忽略大小写(ignore case)
-n 查找时显示行号(line number)
-o 查找时只显示匹配的内容
-A 找到匹配行以及后几行
-B 输出匹配行以及前几行
-r 递归搜索所有文件
-v 反转查找,输出与模式不相符的行
-n 显示符合模式要求的行号
\bworld\b \b...\b 单词的边界 也可以使用\<...\>
\bworld 以world这个单词开头
world\b 以world这个单词结尾
例题:
写一个表示邮箱的正则
feng@qq.com
1234feng@163.com
meng.xianhui@yahoo.cn
liudehua@sina.com
10001@qq.com
123_ui@12306.cn
qilu@qilu.edu
qilu@qilu.edu/fjdkfjk/fjdk
egrep "[0-Z_.]+@[0-Z]+\.[0-Z]+" mail.txt
写一个表示下面网址的正则表达式出来。例如:
http://www.baidu.com
http://www.sina.com
http://news.163.com
http://www.12306.cn
http://www.qillu.edu
rsync://www.github.com/abc
ftp://192.168.0.1
ftp://www.baidu.com
egrep "[a-Z]+://([0-Z]+\.){2}[0-Z]+(\.[0-Z]+)?" web.txt