首页 > 系统服务 > 详细

shell 正则表达式

时间:2019-11-07 00:17:54      阅读:102      评论:0      收藏:0      [点我收藏+]

2.grep 实现正则表达式

语法:
Usage: 
    grep [OPTION]... PATTERN [FILE]...
    command studot | grep [OPTION]... PATTERN

1.正则表达式:

[^a-z]  
[0-9]{11}               #必须刚刚好11
[0-9]{11,}              #至少11,也可以是11以上
[0-9]{8,11}             #最少8次,最多11次
[A-Z]
^(133|152|166)[0-9]{8} 
^.*
^
$

ls file-*
ls *                #通配符一般用于筛选文件
grep * filename     #正则表达式一般用于匹配文件的内容,或者用户输入的内容

正则表达式 描述
\       转义符,将特殊字符进行转义,忽略其特殊意义
^       匹配行首,则是匹配字符串的开始
$       匹配行尾,$则是匹配字符串的结尾
^$      表示空行
.       匹配除换行符\n之外的任意单个字符
[ ]     匹配包含在[字符]之中的任意一个字符
[^ ]    匹配[]之外的任意一个字符
[ - ]   匹配[]中指定范围内的任意一个字符
?       匹配之前的项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]

2.环境一:

[root@chengyinwu grep]# cat phone.txt 
13317190000
15210540000
16602740000
aaa11111111
1111111111111
13511123456
18514560211
13317195011aaaa

需求1:匹配以133/166/152开头的手机号码

[root@chengyinwu grep]# egrep "^(133|166|152)[0-9]{8}$" phone.txt 
13317190000
15210540000
16602740000

3.环境二:

[root@chengyinwu grep]# cat test.txt 
I am qiuzengjia teacher!
I teach linux.
test

I like badminton ball ,billiard ball and chinese chess!
my blog is http://www.baozexu.com
our site is http://www.increase93.com
my qq num is 1176495252.
not 117666649555252.

需求2:

1.过滤以m开头的行
[root@manager grep]# grep "^m" test.txt
2.排除空行,并打印行号
[root@manager grep]# grep -nv "^$" test.txt
3.匹配任意一个字符,不包括空行
[root@manager grep]# grep  "." test.txt
4.匹配所有内容
[root@manager grep]# grep  ".*" test.txt
5.匹配以点结尾的
[root@manager grep]# grep  "\.$" test.txt
6.匹配有a或b或c的行
[root@manager grep]# grep  "[a-c]" test.txt
[root@baozexu grep]# egrep "a|b|c" test.txt 
7.匹配数字所在的行
[root@manager grep]# egrep  "[0-9]" test.txt
8.匹配所有小写字母
[root@manager grep]# egrep  "[a-z]" test.txt
9.匹配1176495252的qq号码
[root@manager grep]# egrep  "\<[0-9]{10}\>" test.txt
10.匹配117666649555252的qq号码
[root@baozexu grep]# egrep "\<[0-9]{15}\>" test.txt
11.匹配包含4个6的行
[root@baozexu grep]# egrep "[6]{4}" test.txt

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

10.0.0.61    
思路分析:
    第一列 10  192 172     至少2位数字,最多3位数字
    第二列     至少1位 最多三位
方式一:    
ifconfig eth0 | grep "^.*inet " | egrep -o "[0-9]{2,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
方式二:
ifconfig eth0 | grep "^.*inet " | egrep -o "[[:digit:]]{2,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}

需求4:使用grep正则表达式方式,排除nginx日志文件的空行和#号开头的行。

[root@manager grep]# egrep -v "(^#|^$|^[[:space:]]+#)" nginx.conf

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

[root@manager grep]# egrep -o "HTTP/(1|2|3)\.(0|1)" access_log_grep

需求6:使用grep正则表达式方式,匹配133、152、166、135开头的手机号码。

    手机号11位   3 固定   8位不固定
?   ^(133|152|166|135)[0-9]{8}$
方式一:
[root@baozexu grep]# egrep "^(133|152|166|135)[0-9]{8}$" phone.txt 
[root@manager grep]# cat grep_phone.sh 
#!/bin/bash

read -p "请输入你要验证的手机号: " Action

#1.确保输入的是整数
if [[ $Action =~ [0-9]+$ ]];then
    #2.然后判断输入的是不是133 152 166 开头的 11 位数
    if [[ $Action =~ ^(133|152|166|135)[0-9]{8}$ ]];then
        echo "你输入的手机号 $Action 合法"
    else
        if [ ${#Action} -gt 11 ];then
            echo "你输入的手机号 长度超过 11位数...."
        elif [ ${#Action} -lt 11 ];then
            echo "你输入的手机号 长度小于 11位数...."
        else
            echo "你的手机号没有备案"
            exit
        fi
    fi
else

echo "你输入的 $Action 手机号错误...
exit

fi

方式二:
[root@manager grep]# cat grep_phone.sh 
#!/bin/bash

read -p "请输入你要验证的手机号: " Action

#1.确保输入的是整数
if [[ $Action =~ [0-9]+$ ]];then
    #2.然后判断输入的是不是133 152 166 开头的 11 位数
    if [[ $Action =~ ^1[3-9][0-9]{9}$ ]];then
        echo "你输入的手机号 $Action 合法"
    else
        if [ ${#Action} -gt 11 ];then
            echo "你输入的手机号 长度超过 11位数...."
        elif [ ${#Action} -lt 11 ];then
            echo "你输入的手机号 长度小于 11位数...."
        else
            echo "你的手机号没有备案"
            exit
        fi
    fi
else
    echo "你输入的 $Action 手机号错误..."
    exit
fi

需求7:使用grep正则表达式方式,匹配zabbix_agentd.conf配置文件中所有已启用的配置。

[root@manager grep]# egrep -v  "^#|^$" zabbix_agentd.conf  
[root@manager grep]# grep '^[a-Z]' zabbix_agentd.conf 

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

[root@manager grep]# cat grep_email.sh 
#!/bin/bash 
read -p "请输入你要验证的email Allow [ qq | 163 | sina ]: " Action

if [[ $Action =~ ^([a-z]|[A-Z]|[0-9])+@(163|qq|sina)\..+$ ]];then
    echo "Email $Action 验证成功"
else
    echo "Email $Action 验证失败"
fi

需求9:使用grep正则表达式方式,匹配合法的email地址。

[root@manager grep]# cat grep_email_2.sh 
#!/bin/bash
read -p "请输入你要验证的email Allow [ qq | 163 | sina ]: " Action
if [[ $Action =~ ^([a-z]|[A-Z]|[0-9])+@([a-Z]|[0-9])+\..+$ ]];then
    echo "Email $Action 验证成功"
else
    echo "Email $Action 验证失败"

需求10:使用grep正则表达式方式,匹配a b c 三类私网IP地址。

10.0.0.0     ~  10.255.255.255 
172.16.1.0   ~  172.16.31.254
192.168.1.0  ~  192.168.255.255 

read -p "请输入需要校验的IP地址: " Action
if [[ $Action =~ ^(10)\.([0-9]|[1][0-9]{0,2}|[2][0-9]|[2][0-4][0-9]|[2][0-5][0-5]|[3-9][0-9])\.([0]|[1][0-9]{0,2}|[2][0-9]|[2][0-4][0-9]|[2][0-5][0-5]|[3-9][0-9])\.([0]|[1][0-9]{0,2}|[2][0-9]|[2][0-4][0-9]|[2][0-5][0-5]|[3-9][0-9])$ ]];then
    echo " $Action 属于A类地址"

elif [[ $Action =~ ^(172)\.([1][6-9]|[2][0-9]|[3][0-1])\.([0]|[1][0-9]{0,2}|[2][0-9]|[2][0-4][0-9]|[2][0-5][0-5]|[3-9][0-9])\.([0]|[1][0-9]{0,2}|[2][0-9]|[2][0-4][0-9]|[2][0-5][0-5]|[3-9][0-9])$ ]];then
    echo "$Action 属于B类地址"

elif [[ $Action =~ ^(192)\.(168)\.([0]|[1][0-9]{0,2}|[2][0-9]|[2][0-4][0-9]|[2][0-5][0-5]|[3-9][0-9])\.([0]|[1][0-9]{0,2}|[2][0-9]|[2][0-4][0-9]|[2][0-5][0-5]|[3-9][0-9])$ ]];then
    echo "$Action 属于C类地址"

else
    echo "$Action 不属于地址"
fi

需求11:取出身份证,匹配是哪个省,是什么出生,是男还是女,是第几个出生的。

身份证位数: 18    
最后一位x:  0   
年龄:      从第7位开始到12位
倒数第二位: 奇数为男 偶数为女
最后四位:    代表是本省第多少个出生。

甘肃:  620
江西:  360
河北:      130
山东:  370
湖北:   420
上海:  310
北京:  110
新疆:  650

思路:判断输入输入的是否是纯数字
        1.1 判断变量传进来的是否足够18位
        1.2 判断开头前三位 符合哪个地区
        1.3 输出内容--》函数 (变量值进行切片)

[root@baozexu grep]# cat sfz.sh 
#!/bin/bash
#********************************************************************
#QQ: 991540698
#Date: 2019-11-05
#FileName: sfz.sh
#Description: 
#********************************************************************

mem_option () {

cat <<-EOF

1.省份
2.出生年月日
3.性别
4.第几个出生的
5.exit

-----------------------------

EOF
}

while true
do
read -p "请输入你要查询的身份证:" Action
if [[ ! $Action =~ ^[0-9]{18}$ ]];then
    echo "请输入正确的身份证!"

else
    mem_option
    while true
    do
        sfz=$(echo ${Action:0:3})
        nl=$(echo ${Action:6:8})
        xb=$(echo ${Action:0-2:1})
        dj=$(echo ${Action:0-4:4})
        dj2=$(echo ${Action:0-4:3})

?   read -p "请选择以上菜单中你想查询的选项:" Action2
?   case $Action2 in
?   1)
?       case $sfz in
?           130)
?               echo "河北省"
?               ;;
?           140)
?               echo "山西省"
?               ;;
?           370)
?               echo "山东省"
?               ;;
?           430)
?               echo "湖南省"
?               ;;
?           622)
?               echo "甘肃省"
?               ;;
?           420)
?               echo "湖北省"
?               ;;
?           110)
?               echo "北京"
?               ;;
?           650)
?               echo "新疆"
?               ;;
?           310)
?               echo "上海"
?               ;;
?           *)
?               echo "你会查身份证吗"
?       esac
?               ;;
?   2)
?       echo "$nl 出生"
?       ;;
?   3)
?       if [ $[$xb%2] -eq 0 ];then
?           echo "女"
?       else
?           echo "男"
?       fi
?       ;;
?   4)
?       if [[ $dj =~ ^[0-9]+$ ]];then
?           echo "是第${dj}个出生的"
?       else
?           echo "是第${dj2}个出生的"
?       fi
?       ;;
?   5)
?       break
?       ;;
?   *)
?       echo "USAGE: $0 [ 1 | 2 | 3 | 4 | 5 ]"
?   
?   esac
done

fi

?   read -p "是否要继续查询:[ yes | no ]" Action3
?   case $Action3 in
?       y|yes)
?           continue
?           ;;
?       n|no)
?           exit 1
?           ;;
?       *)
?           echo "USAGE $0 [ yes | no ]"
?   esac
done

sed实践:

1)  打印/etc/passwd中第20行
[root@baozexu ~]# sed -n '20p' /etc/passwd

2)  打印/etc/passwd中从第8行开始,到第15行结束的内容
[root@baozexu ~]# sed -n '8,15p' /etc/passwd

3)  打印/etc/passwd中从第8行开始,然后+5行结束的内容
[root@baozexu ~]# sed -n '8,+5p' passwd

4)  打印/etc/passwd中开头匹配bin字符串的内容
[root@baozexu ~]# sed -n '/^bin/p' passwd 

5)  打印/etc/passwd中开头为root的行开始,到开头为ftp的行结束的内容
[root@baozexu ~]# sed -n '/^root/,/^ftp/p' passwd

6)  打印/etc/passwd中第8行开始,到含有/sbin/nologin的内容的行结束内容
[root@baozexu ~]# sed -n '8, \/sbin\/nologin/p' passwd

1)  passwd文件第10行后面追加“Add Line”
[root@baozexu ~]# sed -i '10a Add Line' passwd

2)  passwd文件第10行到第20行,每一行后面都追加 "Test Line"
[root@baozexu ~]# sed -i '10,20a Test Line' passwd

3)  passwd文件匹配到/bin/bash的行后面追加 "Insert Line"
[root@baozexu ~]# sed -i '/\/bin\/bash/a Insert Line' passwd

4)  passwd文件匹配到以bin开头的行,在匹配的行前追加 "Add Line Before"
[root@baozexu ~]# sed -i '/^bin/i Add Line Before' passwd

5)  passwd文件每一行前面都追加 “Insert Line Before”
[root@baozexu ~]# sed -i 'a Insert Line Before' passwd

6)  将/etc/fstab文件的内容追加到passwd文件的第10行后面
[root@baozexu ~]# sed -i '10r /etc/fstab' passwd

7)  将/etc/inittab文件内容追加到passwd文件匹配/bin/sync行的后面
[root@baozexu ~]# sed -i '/\/bin\/bash/r /etc/inittab' passwd

8)  将/etc/hosts文件内容追加到passwd文件中10行的后面
[root@baozexu ~]# sed -i '10r /etc/hosts' passwd

9)  将passwd文件匹配到/bin/bash的行追加到/tmp/sed.txt文件中
[root@baozexu ~]# sed -i '/\/bin\/bash/w /tmp/sed.txt' passwd 

10)将passwd文件从第10行开始,到匹配到nfsnobody开头的所有行内容追加到/tmp/sed-1.txt
[root@baozexu ~]# sed -i '10,/^nfsnobody/w /tmp/sed-1.txt' passwd

shell 正则表达式

原文:https://www.cnblogs.com/baozexu/p/11809189.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!