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