正则表达式(regular expression)定义:正则表达式是由字母、数字、特殊符号按照某种正确的规则组合而成的一个公式,用来表达某种含义。
表达式表达的意思,其他的程序根据这个意思去查找内容,然后进行增删改查的功能。
perl语言最先推出正则表达式,python、go、Java、shell等编程语言都支持正则表达式。
可以把它理解为一种方法,很多命令都支持或者使用这种方法(vim grep sed awk nginx等)。
元字符:由特殊含义的字符,可以表示其他的含义。
1.基本正则表达式 ^ $ . *
2.扩展正则表达式 | + ? {}
* 代表前面的字符可以出现0次或者N次
? 代表前面的字符可以出现1次或者0次 a? --> a
[...] 代表范围内任意一个字符 [a-Z] 、[0-9] 代表0,1,2,3,4,5,6,7,8,9 任意一个
[^...] 代表范围外任意一个字符
{1,7} 代表前面的字符出现1次到7次 {2} 表示前面的字符出现2次
+ 代表前面的字符出现1到多次 a+ --> a aa aaaaaaaa
^ 代表以什么开头
$ 代表以什么结尾
^$ 代表空行
. 代表任意一个字符
.* 代表所有的字符
| 或者
\< 表示词首部 相当于\b
\> 表示词尾部 相当于\b
\< abc \> 表示abc这个单词 等价于 \b abc \b
[root@web1 lianxi]# cat sc.txt
liquan123 liquanabc fengliquan zhangliquan123
liquan
xiaoliquan
xiaoliquanliu
[root@web1 lianxi]# cat sc.txt |egrep "\"
liquan
[root@web1 lianxi]# cat sc.txt |egrep "liquan\>"
liquan123 liquanabc fengliquan zhangliquan123
liquan
xiaoliquan
[root@web1 lianxi]# cat sc.txt |egrep "liquan\b"
liquan123 liquanabc fengliquan zhangliquan123
liquan
xiaoliquan
[root@web1 lianxi]# cat sc.txt |egrep "\bliquan"
liquan123 liquanabc fengliquan zhangliquan123
liquan
[root@web1 lianxi]# cat sc.txt |egrep "\bliquan\b"
liquan
-i 不区分大小写
-n 显示行号
-o 仅展示筛选出来的(对于字符串)
-A 在什么之后
-B 在什么之前
-C 上下文
-v 取反 (整行) [^0-9]对单个字符串取反
-r 递归查找
-E 对扩展正则的支持 相当于使用egrep
例子:
“sc[0-9]+feng+de$" --> 这就是模式
^feng 以feng开头的
bash$ 以bash结尾的
^feng[0-9] 以feng0,feng1,···,feng9中任意一个开头
123[a-z] 代表123a,123b,123c,···,123z
^[0-9]+$ 全是数字的
A类ip地址的正则-->1~126.0~255.0~255.0~255
将1-126划分为4段,1-9、10-99、110、119、120-126
将0-255划分为5段,0-9、10-99、100-199、200-249、250-255
([1-9]|[1-9][0-9]|1[01][0-9]|12[0-6])(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}
B类ip地址正则-->128~191.0~255.0~255.0~255
将128-191划分为3段,128-129、130-189、190-191
将0-255划分为5段,0-9、10-99、100-199、200-249、250-255
(12[89]|1[3-8][0-9]|19[01])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}
C类ip地址正则-->192~223.0~255.0~255.0~255
将192-223划分为3段,192-199,200-219,220-223
将0-255划分为5段,0-9、10-99、100-199、200-249、250-255
(19[2-9]|2[0-1][0-9]|22[0-3])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}
1.进入/lianxi目录,复制/etc/passwd到当前目录下,然后对passwd进行操作
2、查找出当前passwd文件中以ftp或者mail开头的行,在屏幕上输出。
cat passwd |egrep "^ftp|^mail"
3、查找出当前passwd文件中首行不是以r、m、f开头的行,在屏幕上输出。
cat passwd |egrep -v "^[rmf]"
egrep -v "^r|^m|^f" passwd
4、查找出当前passwd文件中以bash结尾的行。
cat passwd | grep "bash$"
5、查找出/etc/login.defs文件中的有效行(不显示空行和注释行)。
cat /etc/login.defs|egrep -v "^$|^#"
6、查找出/var/log/messages文档中有16个字母的单词?
cat /var/log/messages |egrep "\b[a-Z]{16}\b"
7、查找出来/etc/passwd文件里用户名包含liu同时使用bash的用户
cat /etc/passwd|egrep ".*liu.*:x.*bash$"
8、查找/etc/ssh/sshd_config 里的有效行(不显示空行和注释行)
cat /etc/ssh/sshd_config|egrep -v "^$|^#"
9、查找出/etc/ssh/sshd_config 文件里的包含连续2个数字的行
cat /etc/ssh/sshd_config| grep "\<[0-9][0-9]\>"
cat /etc/ssh/sshd_config| egrep "\<[0-9]{2}\>"
10、查找出/etc/ssh/sshd_config 包含特殊字符的行
cat /etc/ssh/sshd_config| egrep -o "[^0-Z]"
11、查找出/etc/ssh/sshd_config 不包含数字的行
cat /etc/ssh/sshd_config|grep -v "[0-9]"
12、查找出/var/log/secure里的ip地址出来
egrep -o "[0-25]?[0-9]+\.[0-25]?[0-9]+\.[0-25]?[0-9]+\.[0-25]?[0-9]+" /var/log/secure
13、查找出/etc/ssh/sshd_config里包含port字符的行和后5行的内容
egrep -A5 "port" /etc/ssh/sshd_config
13、写一个表示下面网址的正则表达式出来。例如:
vim web.txt 内容如下:
http://www.baidu.com
http://www.sina.com
https://www.163.com
http://www.12306.cn
http://www.qillu.edu
rsync://www.github.com/abc
ftp://192.168.0.1
ftp://www.baidu.com
协议://字符串.字符串.字符串
要求你了解正常的网站的地址
cat web.txt|egrep "(http|https|ftp|rsync)://[0-Z]+\.[0-Z]+\.[0-Z]+.*"
14、写一个表示邮箱的正则
vim mail.txt 内容如下:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
fengdeyong 123
[email protected]
[email protected]/fjdkfjk/fjdk
字符串@字符串.字符串
需要你了解正常的邮箱的格式
cat mail.txt|egrep -o "[0-Z_]+@[0-Z]+\.[0-Z]+"
用法脚本练习:
批量新建用户并设置密码
#!/bin/bash
#author: zhou
#time: 2023-3-7
#company: nongda
#mail: [email protected]
#description: 批量新建用户,并且设置密码
#清空文件
>user_pwd.txt
username=$1
#对用户名进行检测,如果全部是数字,提醒用户,停止脚本运行
#if echo $username |egrep "^[0-9]+$" &>/dev/null;then
if [[ $username =~ ^[0-9]+$ ]];then
echo "用户名全部是数字,请重新输入用户名"
#退出脚本,停止执行
exit
fi
#批量新建用户,并且设置密码
for i in $(seq $2)
do
#判断用户是否存在
if id $username$i &>/dev/null ;then
echo "$username$i 已经存在"
else
useradd $username$i
#生成密码
u_pwd=$(mkpasswd -l 30 -d 5 -C 5 -s 3)
echo $u_pwd |passwd --stdin $username$i &>/dev/null
echo "$username$i $u_pwd" >>user_pwd.txt
fi
done
echo "新建用户并且设置密码成功"