语法:
Usage:
grep [OPTION]... PATTERN [FILE]...
command studot | grep [OPTION]... PATTERN
[^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]
[root@chengyinwu grep]# cat phone.txt
13317190000
15210540000
16602740000
aaa11111111
1111111111111
13511123456
18514560211
13317195011aaaa
[root@chengyinwu grep]# egrep "^(133|166|152)[0-9]{8}$" phone.txt
13317190000
15210540000
16602740000
[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.
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
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}
[root@manager grep]# egrep -v "(^#|^$|^[[:space:]]+#)" nginx.conf
[root@manager grep]# egrep -o "HTTP/(1|2|3)\.(0|1)" access_log_grep
手机号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
[root@manager grep]# egrep -v "^#|^$" zabbix_agentd.conf
[root@manager grep]# grep '^[a-Z]' zabbix_agentd.conf
[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
[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.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
身份证位数: 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
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
原文:https://www.cnblogs.com/baozexu/p/11809189.html