shell 正则表达式

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值