11.shell grep+正则表达式过滤数据

正则表达式(数据筛选)

正则表达式:以特定的符号表示一组数字或字母的一种规则。
在面对大量的日志,程序,以及命令的输出,过滤我们需要的内容。

正则表达式语法:

      正则表达式       描述                                                         
    | ----------  | ----------------------------------------------------------- 
    | \           | 转义符,将特殊字符进行转义,忽略其特殊意义    (在linux中 \ 用来换行的)  \cp #脱掉命令的别名,让命令回归原有的属性,例如 \cp 1.txt /tmp 就会直接执行拷贝操作,不会提示
    | ^           | 匹配行首,则是匹配字符串的开始                               
    | $           | 匹配行尾,$则是匹配字符串的结尾                              
    | ^$          | 表示空行                                                     
    | .           | 匹配除换行符\n之外的任意单个字符,不包含换行                            
    | [ ]         | 匹配包含在[字符]之中的任意一个字符                           
    | [^ ]        | 匹配 [^]之外的任意一个字符      例  [^a-Z]:排除a-Z  后的内容                          
    | [ - ]       | 匹配[]中指定范围内的任意一个字符                             
    | ?           | 匹配之前的项1次或者0次                                       
    | +           | 匹配之前的项1次或者多次                                      
    | *           | 匹配之前的项0次或者多次, .*                                  
    | ()          | 匹配表达式,创建一个用于匹配的子串                           
    | { n }       | 匹配之前的项n次,n是可以为0的正整数                          
    | {n,}        | 之前的项至少需要匹配n次                                      
    | {n,m}       | 指定之前的项至少匹配n次,最多匹配m次,n<=m                   
    || 交替匹配|两边的任意一项ab(c|d)匹配abc或abd                 
    | 特定字符    |                                                              
    | [[:space:]] | 空格                                                         
    | [[:digit:]] | [0-9]                                                        
    | [[:lower:]] | [a-z]                                                        
    | [[:upper:]] | [A-Z]                                                        
    | [[:alpha:]] | [a-Z]                                                        

grep+正则表达式 过滤数据
示例:

1.过滤以m开头的行
grep "^m" test.xt

2.排除空行,添加行号 "^$"表示空行 -v取反 -n添加行号
grep -nv "^$" test.txt

3.匹配任意一个字符,不包含空行
grep "." test.txt

4.匹配所有内容
grep ".*" test.txt

5.匹配.结尾的内容 .有特含义,所以需要转义
grep "\.$" test.txt

6.匹配有a或者有b或者有c的行
egrep "a(b|c)" test.txt

7.匹配包含数字的行
grep "[0-9]" test.txt

8.匹配包小写字母的行
grep "[a-z]" test.txt

9.匹配有数字的行,开头结尾必须是数字,数字最多必须是9位
egrep "<\[0-9]{9}\>" test.txt

10.匹配包含5个8的行
egrep "[8]{5}" test.txt


案例1:

使用grep正则方式方式,提取eth0的IP地址。

ifconfig eth0 | egrep -o "[0-9]{2,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | head -1

简单方法:
ifconfig eth1 | awk 'NR==2 {print $2}'


案例2:

使用grep正则表达式方式,排除nginx日志文件的空行和#号开头的行。
"^$|^#|[[:space:]]#" 匹配空行、#开头的行、空格#开头的行

egrep -v "^$|^#|[[:space:]]#" /etc/nginx/nginx.conf


案例3:

使用grep正则方式方式,提取ens192的IP地址。

思路梳理:
IP地址第一位:至少2位数字,最多3位数字 10 172 192
第二位:至少1位,最多3位 以此类推

ifconfig ens192|egrep -o "[0-9]{2,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"|head -1

-o 仅显示匹配的内容

在这里插入图片描述
可以在此基础上再改进一下

ifconfig ens192 |egrep -o "[0-9]{2,3}(\.[0-9]{1,3}){3}" |head -1

在这里插入图片描述
(.[0-9]{1,3}){3} 表示()中的内容匹配3次

更简单的办法
打印第二行第二列
ifconfig ens192 | awk 'NR==2 {print $2}'

在这里插入图片描述


案例4:

使用grep正则表达式方式,排除nginx日志文件的空行和#号开头的行。
egrep -v "^$|^#|[[:space:]]#" nginx.conf

-v 反选
^$表示空行
^#表示#开头的行
[[:space:]]#表示空格#开头的行

在这里插入图片描述


案例5:

使用grep正则表达式方式,匹配nginx日志中的http1.0 和http1.1 http2.1 http2.0

egrep -o "HTTP/(1|2)\.(0|1)" access.log |uniq -c

(1|2)表示交替匹配|两边任意一项
在这里插入图片描述


案例6:

使用grep正则表达式方式,匹配133、135开头的手机号码。
思路梳理:

 1.确保用户输入的11位的纯数字。
     是:验证是否满足 133 135等开头,
         满足:手机号验证成功。
         不满足:手机号验证失败。
     不是:
         提示手机号有误。
#!/bin/bash

read -p "请输入11位手机号码[ 133 | 135 ]开头:" action 

if [[ $action =~ ^[0-9]{11}$ ]];then #1.确保用户输入的是纯数字,并且是11位,如果不是则报错
	if [[ $action =~ ^(133|135)[0-9]{8}$ ]];then #2.确保用户输入的手机号是133|135开头,并且中间是连续的8个整数结尾
		echo "手机号:$action 满足要求"
	else
		echo "$action 不满足[133 | 135 ] 开头的要求"
	fi

else
	echo "$action 不满足11位的要求"
fi

在这里插入图片描述


案例7:

使用grep正则表达式方式,匹配 qq、163、sina的 email地址。

邮箱的后缀是固定不变的。前缀:一串数字、字母、字母+数字

#!/bin/bash

read -p "输入邮箱地址[qq|163|sina]" action

if [[ $action =~ ^([0-9]|[a-z]|[A-Z])+@(qq|163|sina)\.com$ ]];then
	echo "$action 符合要求"
else
	echo "$action 不符合要求"

fi

在这里插入图片描述


案例8:

现在有如下文件,希望通过如下方式匹配所有类型的内容:grep “正则”.shop.test.com

文件内容:
test.txt

xxt-demo.shop.test.com
xxt-demoadmin.shop.test.com
abc.shop.test.com
abcadmin.shop.test.com
123.shop.test.com
abc123.shop.test.com
xxt-123.shop.test.com
xxt-a123.shop.test.com
xxt-aZ4423.shop.test.com
abcadmin.shop.test.com
123.shop.test.com
abc123.shop.test.com
t1.shop.test.com
xxa-aaaaa11ZZ.shop.test.com

egrep -o "^([0-9]{1,}|[a-z]{1,}|[0-9|a-z]{1,}|[a-z|A-Z|0-9]{1,}\-[0-9|a-z|A-Z]{1,})\.shop\.test.com$" test.txt

在这里插入图片描述


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值