11grep和正则表达式

1、Linux三剑客之grep命令

1、grep命令的作用和使用场景

grep命令一般用来筛选数据,一般用来筛选我们需要的数据
格式:
grep [参数] [过滤的规则] [路径]

标准输出 | grep [参数] [过滤规则]

2、grep命令的参数

参数:
-n : 显示过滤出来的文件在文件中的行号
-o : 只显示过滤匹配到的内容
-q : 静默输出(一般用在shell脚本中)
-i : 忽略大小写
-c : 显示匹配到的行数
-v : 反向查找
-w : 匹配某个词
-E : 使用扩展正则
-R : 递归查询
-l : 只打印文件路径

扩展参数:
-A : 显示匹配到的数据的后几行
-B : 显示匹配到的数据的前几行
-C : 显示匹配到的数据的前后各几行

知识储备:
$? : 代表上一条命令执行是否成功(0:代表成功,非0代表失败)
: 一连串字母和数字组成的字符串
wc -l : 打印显示有多少行

案例1、要求过滤出/etc/passwd中包含的root的行及其行号
grep -n "root" /etc/passwd

案例2、要求过滤出/etc/passwd中包含的root的行,只显示过滤到的内容
grep -o "root" /etc/passwd

案例3、要求过滤/etc/passwd中的Root,忽略大小写
grep -i "Root" /etc/passwd

案例4、要求匹配mail及其后两行
grep -n -A 2 "mail" /etc/passwd

案例5、要求匹配mail及其前两行
grep -n -B 2 "mail" /etc/passwd

案例6、要求匹配mail及其前后各两行
grep -n -C 2 "mail" /etc/passwd

案例7、要求显示包含root的行有多少行
grep -c "root" /etc/passwd

案例8、要求查询不包含root的行
grep -v 2 "root" /etc/passwd

案例9、匹配mo这个词
grep -w "mo" 1.txt

案例10、要求匹配出包含mo的行
grep -E "(mo)+" 1.txt

案例11、要求找出/etc目录下,那些文件中包含root
grep -R "root" /etc

只打印文件路径
grep -Rl "root" /etc

练习1、计算/etc目录下包含root的文件有多少个?
grep -Rl "root" /etc | wc -l

练习2、查询/etc/passwd文件中包含/bin/bash的行并输出行号
grep -n "/bin/bash" /etc/passwd

练习3、过滤出当前主机包含的IP
ip a | grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}"
知识储备:
nl : 用来计算文件中的行号

格式:
nl [选项(参数)] [文件路径]

选项:
-b : 指定行号指定的方式,主要有两种:
-b a : 表示不论是否为空,也同样列出行号(类似 cat -n)
-b t : 如果有空行,空的那一行不要列出行号(默认值)
-n : 列出行号表示的方法,主要有三种:
-n ln : 行号在荧幕的最左方,且不加 0
-n rn : 行号在自己栏位的最右方显示,且不加 0
-n rz : 行号在自己栏位的最右方显示,且加 0
-w : 行号栏位的占用的位数

案例1、让行号前面自动补上0,统一输出格式
nl -b a -n rz /etc/passwd

 

2、正则表达式

正则表达式是通过包含特殊含义的一些字符去适配各种匹配场景,从而匹配出想要的结果

例如:

1、怎么验证用户输入的手机号

2、怎么验证用户输入的邮箱

3、怎么验证用户输入的身份证号码

1、普通正则表达式

*   :   匹配零个或多个前导字符
$ : 以字符结尾
. : 匹配任意一个字符(换行符除外)
^ : 以指定字符开头
.* : 所有的字符的任意个数
[] : 或者(其中包含所有的字符的或者)
[^] : 取反

[A-Z] : A-Z所有的一个字母
[a-z] : a-z所有的一个字母
[0-9] : 0-9所有的一个数字

案例1、匹配包含22的行
grep "222*" 1.txt

案例2、以2结尾的行
grep "2$" 1.txt

案例3、要求输出包含eth的行
grep "eth." 1.txt

案例4、以1开头的行
grep "^1" 1.txt

案例5、要求打印出/etc/nginx/nginx.conf中不是以#号开头的行
grep "^[^#]" /etc/nginx/nginx.conf

案例6、要求匹配出2后面的任意数量的任意字符
grep "2.*" 1.txt

案例7、要求匹配出本机中所有的普通用户
grep ":[0-9][0-9][0-9][0-9]" /etc/passwd
egrep ":[0-9]{4}" /etc/passwd

2、扩展正则表达式(grep必须加 -E 参数,或者使用egrep命令)

egrep 等价于 grep -E

+   :   前导字符的一个或多个
? : 前导字符的零个或一个
| : 或者(竖线两边的字符的或者)

() : 分组,组成一个整体
\n : n代表前面第几个分组

{m,n} : 范围,至少有m个,最多有n个
{m} : 固定m个
{m,} : 至少m个

案例1、匹配一个或多个2
egrep "2+" 1.txt
grep "22*" 1.txt
egrep "2{1,}" 1.txt

案例2、匹配出三个2
egrep "2{3}" 1.txt

案例3、查询出包含22或者包含33的行
egrep "22|33" 1.txt

案例4、匹配出包含12341234的行
egrep "(1234){2}" 1.txt
egrep "(1234)\1" 1.txt

案例5、要求匹配出包含1234abcd1234abcd的行
grep "1234abcd1234abcd" 1.txt
grep -E "(1234)(acbd)\1\2" 1.txt

练习1、过滤出当前系统IP
ip a | grep -o -E "([0-9]{1,3}\.){3}[0-9]{1,3}"

练习2、过滤出手机号""
echo "15212345678" | grep -E "(155|187|136|177|138|137|188)[0-9]{8}"

练习3、过滤邮箱
echo "123456@qq.com" | grep -E "[0-9a-zA-Z]+@[0-9a-z]+(\.com|\.com\.cn|\.edu|\.edu\.cn|\.top)"

 

 

posted @ 2021-11-06 20:17  vonmo  阅读(110)  评论(0编辑  收藏  举报