linux 三剑客之一
使用场景
- 文本处理之"查"
- 想要通过xxx查出想要的文本内容
- 实际: 通过"正则表达式"过滤出想要的文本内容(通过案例体会)
- 用到"正则表达式"知识点
- 作用: 过滤文本内容
- 语法
- grep 参数 正则表达式(匹配规则) 文本路径
- 参数(使用见操作演示)
- -E :使用拓展正则 等价于 egrep (别纠结,本文本查使用场景会用即可)
- -R或-r : 递归匹配
- -o 显示匹配成功的内容,显示一个则换行
- -v 反向过滤
- -i 忽略大小写
- -n 显示出过滤的文本行号
- -A 将匹配成功的后n行显示出来
- -B : 匹配成功之后,将匹配行的前n行显示出来
- -C : 匹配成功之后,将匹配行的前后各n行显示出来
- -c 只显示匹配成功的行数字
- -q 静默输出(即不打印)
配合$?使用
$? : 上一行命令执行的结果,0代表执行成功,其他数字代表执行失败
l : 将文本的名称打印/显示出来(去重:你根据老师视频演示猜出来的,不一定正确)
- 案例
- 在/etc目录下,有多少个文件包含root
- grep -rl 'root' /etc/ | wc -l
-----
正则
-----
分类
1 普通正则
2 拓展正则
3 案例(与grep命令配合使用)
4 转译字符\的含义
详细
1 普通正则
- ^ : 以某字符开头
- $ : 以某字符结尾
- . : 匹配除换行符之外的任意单个字符
- * :匹配前导字符的任意个数
- [] : 某组字符串的任意一个字符
- [^] : 取反
- [a-z] : 匹配小写字母
- [A-Z] : 匹配大写字母
- [a-zA-Z] : 匹配字母
- [0-9] : 匹配数字
- \ : 取消转义
- () : 分组
- \n : 代表第n个分组
2 拓展(高级)正则
- {} :匹配的次数
- {n} : 匹配n次
- {n,} :至少匹配n次
- {n,m} :匹配 n 到 m 次
- {,m} :最多匹配m次
- + :匹配至少有一个前导字符
- ? : 匹配一个或零个前导字符
- | :或
3 案例
- 在/etc/passwd文件中,匹配以ftp开头的行
- grep '^ftp' /etc/passwd
- 在/etc/passwd文件中,匹配以bash结尾的行
- grep 'bash$' /etc/passwd
- 匹配本机中有哪些ip
- 初步过滤
- ip a | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'
- 精确过滤
- ([(1[0-9]{2}){3}(2[0-4][0-9]){3}(25[0-4]){3}[0-9]{1,2}]\.){3}[(1[0-9]{2}){3}(2[0-4][0-9]){3}(25[0-4]){3}[0-9]{1,2}]
- 要求将xxx中的去掉包含 # 开头的行,且要求 # 后至少有一个空格
- grep -vE '^#\ +' /etc/fstab
- 找出文件xxx中至少有一个空格的行
- grep -E '\ +' xxx
- 将 nginx.conf 文件中以#开头的行和空行,全部删除
- grep -vE '^\ *#|^$' /etc/nginx/nginx.conf
- 过滤手机号的正则表达式
- 1[0-9]{10}
- 过滤邮箱的正则表达式
- 例 chenyang@123.com
- [a-zA-Z0-9-_]+@[a-z0-9]+\.(com|cn|com\.cn|net)
- 过滤密码,要求必须要大写字母、小写字母、数字以及下划线,长度在 8 到 16 之间
- ([A-Z]+[a-z]+[0-9]+_+){8,16}
4 转译字符\的含义
---------
grep操作演示
---------
无参数
-o 显示匹配成功的内容,显示一个则换行
-n 显示出过滤的文本行号
-A 将匹配成功的后n行显示出来
- -B : 匹配成功之后,将匹配行的前n行显示出来
- -C : 匹配成功之后,将匹配行的前后各n行显示出来
-c 只显示匹配成功的行数字
-v 反向过滤
-q 静默输出(即不打印)
配合$?使用
$? : 上一行命令执行的结果,0代表执行成功,其他数字代表执行失败
-i 忽略大小写