day12 正则,三剑客之grep

课前小练

1、查询etc目录下以ifcfg开头的文件

find /etc -name "ifcfg*"

2、将/etc/yum.repos.d/目录下所有的.repo文件备份到/tmp下

find /etc/yum.repos.d/ -name "*.repo" -exec cp {} /tmp \;

3、将/etc/下所有的目录复制到/tmp下

find /etc -type d -exec cp -r {} /tmp/ \;

4、将/etc下所有的普通文件打包压缩到/tmp目录下

tar -czPf /tmp/etc.tar.gz $(find /etc -type f | xargs )

5、find命令中的并且和或者

-a
-o

6、同上述第4题,将其打包压缩的文件解压至/mnt目录中

知识储备:

-C : 解压至

tar -xf /tmp/etc.tar.gz -C /mnt

今日内容

linux三剑客之grep

1.grep命令的作用及使用场景
grep命令一般用来筛选数据,筛选我们需要的数据
格式:grep [参数] [过滤的规则] [路径]
    标准输出 | grep [参数] [过滤规则]
2.grep命令的参数
参数:
    -n:显示匹配行及行号
    -o:只输出匹配的内容
    -q:静默输出(一般用在shell脚本中,然后用 echo $? 查看命令执行结果)
    -i:忽略大小写(只适用于单字符)
    -c:显示匹配到的行数(注意不是匹配的次g数)E
    -v:反向查找(显示不匹配的行,就是我们通常说的排除某些行,显示不包含匹配文本的所有行)
    -w:匹配某个词(词:一连串字母和数字组成的字符串)
    -E:使用扩展正则(egrep命令)
    -R:递归过滤,(跟随符号链接)
    -l:只输出匹配到的文件名(有去重)(如果匹配成功,只打印文件名,失败则不打印)
    -L:只输出未匹配到的文件名(有去重)
    -s:不显示不存在或无匹配文本的错误信息
    -e: 指定匹配规则,可指定多次,实现 or 的效果,默认,基本正则模式
      可通过在首个 -e 前指定 -E, -G, -F切换模式
        # grep -E -e "th.{2}" -e "th.{3}" roc.txt
        # grep -F -e "^this" -e '^$this' roc.txt
     -f: 指定一个文件,可指定多次,里面包含了匹配的规则,一行一个规则
      相当于把 -e 指定的模式写入了文件
      也可以指定 -E, -G, -F切换模式
   
   
扩展参数:
    -A:显示匹配到的数据及后n行
    -B:显示匹配到的数据及前n行
    -C:显示匹配到的数据及前后n行
 
知识储备:
    $?:代表上一次命令执行是否成功(0代表成功,非0代表失败)
    +:前导字符的一个或多个
    wc-l:打印显示有多少行(统计行)
  3.grep命令和正则表达式的结果
### 案例:
案例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 "root" /etc/passwd
案例9:匹配tian这个词
[root@localhost ~]# cat 1.txt
befggfnb
vtiandsgrt
tiandfbx
tiantian
hetiantian
tiantianhe
2353475
546554
tian
[root@localhost ~]# grep -w "tian" 1.txt
tian
案例10:要求匹配出包含tian的行
[root@localhost ~]# grep -E "(tian)+" 1.txt
vtiandsgrt
tiandfbx
tiantian
hetiantian
tiantianhe
tian
案例11:要求找出/etc目录下,那些文件中包含root
grep -R "root" /etc
只打印文件路径
[root@localhost ~]# grep -Rl "root" /etc/
案例12:静默输出
grep -q "root" /etc/passwd
echo $? # 查看上一条命令返回的状态值,一般0表示执行正常,非0表示执行异常
# 对于 grep ,0表示匹配到了结果,非0表示未匹配到结果

练习:
练习1:计算/etc目录下包含root的文件有多少个?
grep -R -l "root" /etc | wc -l
练习2:查询/etc/passwd文件中包含/bin/bash的行并输出行号
grep -n "/bin/bash" /etc/passwd
练习3:过滤出当前主机包含的IP
[root@localhost ~]# ip a | grep -o -E "([0-9]{1,3}\.){3}([0-9]){1,3}"
127.0.0.1
192.168.15.110
192.168.15.255
172.22.0.110
172.22.15.255

正则表达式

正则表达式是通过包含特殊含义的一些字符去适配各种匹配场景,从而匹配出我们想要的结果。
正则表达式是为处理大量的字符串及文本而定义的一套规则和方法。

1.普通正则表达式

*   匹配前一个字符(连续出现)0或者1次以上(注意:当重复0次的时候,表示啥也没有即空,即匹配所有的内容)
. 点号,表示匹配任意一个且只有一个字符(但是不能匹配换行符)
.* 组合符,匹配所有的内容
^ 尖角号,用法为^oldboy.表示匹配以oldboy单词开头的行
^.* 组合符,匹配以任意多个字符开头的内容
$ 美元符,用法为oldboy$,表示匹配以oldboy单词结尾的行
^$ 组合符,表示空行,逻辑解释就是以^结尾的行,或以$开头的行
\ 转义字符,让有特殊含义的字符脱掉马甲,现出原形,如\.只表示小数点
.*$ 组合符,以任意多个字符结尾的内容
[] 或者(其中包含的所有的字符的或者)
[^] 取反

[A-Z] 匹配[]内任意一个字符,A-Z中的任意一个
[a-z] 匹配[]内任意一个字符,a-z中的任意一个
[0-9] 匹配[]内任意一个字符,0-9中的任意一个
[^abc] 匹配不包含^后的任意字符,这里的^表示对[abc]取反

案例

案例1:匹配包含22的行
grep "22.*" 1.txt
grep "222*" 1.txt
grep "22.*" 1.txt
案例2:以3结尾的行
grep -E "3$" 1.txt
案例3:要求输出包含eth的行
[root@localhost ~]# grep "eth." 2.txt
/etc/sysconfig/network-scripts/ifcfg-eth1
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfgg-eth0
案例4:以1开头的行
[root@localhost ~]# grep "^1" 1.txt
1223344
1234
1222444
122222
12222446
案例5:要求打印出/etc/nginx/nginx.conf中的不是以#开头的行
grep "^[^#]" /etc/nginx/nginx.conf

案例6:要求匹配出2后面有任意数量的任意字符
grep "2." 1.txt
案例7:要求匹配出本机中所有的普通用户
[root@localhost ~]# grep ":[0-9][0-9][0-9][0-9]" /etc/passwd
test04:x:1001:1001::/home/test04:/bin/bash
test:x:1002:1002::/home/test:/bin/bash
test01:x:1003:1003::/home/test01:/bin/bash

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

egrep 等价于 grep -E
常见的扩展正则表达式特殊字符及功能说明
+ 匹配前一个字符1次或1次以上
[:/]+ 匹配括号内的:或/字符1次或1次以上
? 匹配前一个字符0次或1次
| 表示或者,即同时过滤多个字符串(竖线两边的字符的或者)
() 分组,组成一个整体,另外()的内容可以被后面的\n引用,n为数字,代表引用第几个括号的内容
\n n代表的是前面第几个分组 引用前面()里的内容,ps:(aa)\1,匹配结果aaaa
a{m,n} 匹配前一个字符最少m次,最多n次
a{m} 匹配前一个字符m次
a{m,} 匹配前一个字符最少m次
a{,n} 匹配前一个字符最多n次

案例

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

案例2:查询出3个2
egrep "2{3}" 1.txt
案例3:查询出包含 22 或者 33 的行
egrep "22|33" 1.txt
案例4:匹配出包含12341234的行
grep -E "(1234)\1" 1.txt
grep -E "(1234){2}" 1.txt
grep "12341234" 1.txt

案例5;要求匹配出包含1234abcd1234abcd的行
grep "1234abcd1234abcd" 1.txt
grep -E "(1234)(abcd)\1\2" 1.txt
练习1:过滤出当前系统IP
[root@localhost ~]# ip a |grep -o -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
127.0.0.1
192.168.15.110
192.168.15.255
172.22.0.110
172.22.15.255
练习2:过滤出手机号
echo "15516134567" | grep -E "(155|187|136|166|177|138|137|188)[0-9]{8}"
15516134567
[root@localhost ~]# echo "25516134567" | grep -E "(155|187|136|166|177|138|137|188)[0-9]{8}
练习3:过滤出邮箱

[root@localhost ~]# echo "12345@qq.com" | grep -E "[0-9a-zA-Z]+@[0-9a-z]+(\.com|\.com\.cn|\.edu|\.edu\.cn|\.top)"
12345@qq.com
[root@localhost ~]# echo "chenyangqit@qq.com" | grep -E "[0-9a-zA-Z]+@[0-9a-z]+(\.com|\.com\.cn|\.edu|\.edu\.cn|\.top)"
chenyangqit@qq.com
[root@localhost ~]# echo "chenyangqit@qq.edu" | grep -E "[0-9a-zA-Z]+@[0-9a-z]+(\.com|\.com\.cn|\.edu|\.edu\.cn|\.top)"
chenyangqit@qq.edu
[root@localhost ~]# echo "chenyangqit@qq.edu.cn" | grep -E "[0-9a-zA-Z]+@[0-9a-z]+(\.com|\.com\.cn|\.edu|\.edu\.cn|\.top)"
chenyangqit@qq.edu.cn



posted @ 2021-09-29 23:02  甜甜de微笑  阅读(112)  评论(0编辑  收藏  举报