Linux——正则表达式你会了吗?还不来收藏!-爱代码爱编程
目录
grep(global search regular expressino and printing)使用
正则表达式定义
正则表达式:regular expression,模块 re,按照某个正确的规则来表达某个规则,运用规则
正则表达式,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。
正则表达式是由普通字符与元字符组成的文字模式。
正则表达式一般用于脚本编程与文本编辑器中。
eg:[root@kafka01 nginx]# cat error.log|egrep "2021/07/24"
可用于grep(过滤文本)、sed(查找替换文本)、awk(截取文本)、vim等
用处:1.用于帮助查找特定的内容
基础正则表达式
根据不同的严谨程度与功能:分为基本正则表达式与扩展正则表达式。
基础正则表达式是常用的正则表达式的最基础的部分。
在 Linux 系统中常见的文件处理工具中 grep 与 sed 支持基础正则表达式,egrep 与 awk 支持扩展正则表达式。
扩展正则 :egrep = grep -E
[root@kafka01 0724]# cat mobile_pthone.txt|grep -E "wuyifan|\byangqian\b"
htc lenove micsodte oneplus wuyifan wuyifan
sansung xiaomi redmi REDMI123 lizhichao wiyifan yangqian yangqianqian lichaochao
[root@kafka01 0724]# cat mobile_pthone.txt|egrep "wuyifan|\byangqian\b"
htc lenove micsodte oneplus wuyifan wuyifan
sansung xiaomi redmi REDMI123 lizhichao wiyifan yangqian yangqianqian lichaochao
元字符
^$ --> 空行
.* -->任意字符
通配符
grep(global search regular expressino and printing)使用
-c 显示匹配到的行数之和
-o 仅显示匹配本身
-v 显示非匹配,取反(一行)
-i 不区分大小写(一行)
-E 支持扩展表达式
-q 静默模式
-n 显示匹配到的行的行号
-A 2 显示匹配到的行的后2行
-B 2 显示匹配到的行的前2行
-C 2 显示匹配到的行的前后2行
-V 显示版本信息
查找特定字符
-n :表示显示行号
-i :表示不区分大小写
-v : 表示反方向查找
grep -n 'the' abc.txt //查找有the的行,并显示出行号
grep -in ‘the’ abc.txt //不区分大小写查找有the的行,并显示行号
如果是想查找不包含the的行,-vn选项即可:
[root@client ~]# grep -vn 'the' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
...省略内容
中括号 [ ] 集合字符
当我们需要查找两个字符 “shirt” 和 “short” 这两个字符时,其中 i 和 o 都是相同的.
可以用 [ ]来匹配字符,[ ] 中不论有几个字符,都仅代表一个字符
[root@localhost ~]# grep -n 'sh[io]rt' /etc/passwd
查找包含重复单个字符“oo”
[root@localhost ~]# grep -n 'oo' /etc/passwd
集合字符的反向选择可以通过“[^]”实现
在 /etc/passwd文本中查找“oo” 前面不是“w”的字符串
[root@localhost ~]# grep -n '[^w]oo' /etc/passwd
检索“oo”前面不存在大小写字母的字符串
[root@localhost ~]# grep -n '[^a-zA-Z]oo' /etc/passwd
查找包含数字的行
[root@localhost ~]# grep -n '[0-9]' /etc/passwd
行首符“^”与行尾字符“$
查找以the这个字符串开头的行
[root@localhost ~]# grep -n '^the' abc. txt
查找以小写字母开头的行
[root@localhost ~]# grep -n '^[a-z]' abc.txt
查找以大写字母开头的行
[root@localhost ~]# grep -n [A-Z]' abc.txt
查找以不是字母开头的行
[root@localhost ~]# grep -n '^[^a-zA-Z]' abc.txt
查询以点(.)结尾的行
[root@localhost ~]# grep -n '\.$' /etc/passwd
// 这里的.不作为元字符使用,可加上转义符 \
查看空白行的行号
[root@localhost ~]# grep -n '^$' /etc/passwd
任意一个字符“.”与重复字符“*”
在正则表达式中小数点(.)也是一个元字符,代表任意一个字符
*代表的是重复零个或多个前面的单字符
查找以 w 开头 d 结尾,共有四个字符的字符串
[root@localhost ~]# grep -n 'w..d' /etc/passwd
要查询 wood、woood、woooood 等资料,则需要使用星号(*)元字符
[root@localhost ~]# grep –n 'o*' /etc/passwd 'o的数量是0到多个'
查询包含至少两个 o 以上的字符串
[root@localhost ~]# grep –n'ooo*' /etc/passwd 'o的数量是2到多个'
查询以 w 开头 d 结尾,中间的字符可有可无的字符串
[root@localhost ~]# grep –n'w.*d' /etc/passwd
查询任意数字所在行
[root@localhost ~]# grep –n'[0-9][0-9]*' /etc/passwd
连续字符范围“{}”
因为“{}”在 Shell 中具有特殊意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符
查询两个 o 的字符
[root@localhost ~]# grep -n 'o\{2\}' /etc/passwd '2表示两个o'
查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串
[root@localhost ~]# grep -n 'wo\{2,5\}d' /etc/passwd
查询以 w 开头以 d 结尾,中间包含 2 以上 o 的字符串
[root@localhost ~]# grep -n 'wo\{2,\}d' /etc/passwd
扩展正则表达式:egrep命令
使用基础正则表达式查询除文件中空白行与行首为“#” 之外的行(通常用于查看生效的配置文件)
grep –v '^$' test.txt | grep –v '^#'
使用扩展正则表达式
egrep –v '^$|^#' test.txt '单引号内的管道符号表示或者(or)'
正则表达式——邮箱查找
字符串@字符串.com
cat mail.txt |egrep -o "[0-Z_]+@[0-Z]+\.[a-z]+"
正则表达式——网站
http://
https://
ftp://
规律:字符串://字符串.字符串.字符串
正则:[a-z]+://[a+z]+\.[a-z]\.[a-z]+ --> [a-z]+://([a+z]+\.){2}\.[a-z]+[a-z]+://[a+z]+\.[0-z]\.[a-z]+
正则——时间查找
egrep -o "24/jul/2021:16:35:([0-9]|[0-5][0-9])"
正则——IP地址查找
A:0-126
B:128~191
C:192~223
[1-9]|[1-9][0-9]|1[01][0-9]|12[0-6]" -->1-126
[0-9]|[1-9][0-9]|[1][0-9][0-9]|2[0-4][0-9]|25[0-5] -->0-255
"\b([1-9]|[1-9][0-9]|1[01][0-9]|12[0-6])(\.([0-9]|[1-9][0-9]|[1][0-9][0-9]|2[0-4][0-9]|25[0-5])){3}\b"
练习
cat passwd|egrep "^ftp|^mail"
cat passwd|egrep -v "^r|^m|^f"
cat passwd|egrep "bash$"
cat /var/log/messages|grep "\b[a-Z]\{16\}\b"
cat /etc/login.defs|grep -v "^$|^#"
cat passwd|grep -v "^liu|^bash"
cat /etc/ssh/sshd_config|grep -v "^$" |grep -v "^#"
cat /etc/ssh/sshd_config|grep "\b[0-9]\{2\}\b"
cat passwd|grep "[^0-z]"
cat passwd|grep -v "[0-9]"
#!/bin/bash
#生成密码的所有字符
char="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789<>+-{}:.&;"
#统计char的长度
len=${#char}
#定义一个数组,存储最后生成的密码
array=()
n=0
while true
do
#存储每次生成的密码
pass=''
#12位密码,循环12次
for i in {1..12}
do
#每次生成一个随机数,对len取余,确保不会超过char的长度
index=$[RANDOM%len]
#取出char里下标为index的字符
pass=$pass${char:$index:1}
done
#确保生成的密码里有四种字符
if echo $pass |grep -q "[a-z]" && echo $pass |grep -q "[A-Z]" && echo $pass |grep -q "[0-9]" && echo $pass |grep -q "[\<\>\+\-\{\}\:\.\&\;]";then
#判断是否有生成相同的密码
if echo ${array[*]} |grep "$pass";then
continue
else
#把密码存到数组里
array[$n]=$pass
n=$(($n+1))
fi
else
continue
fi
#当数组里的个数为10时,退出循环
if ((${#array[@]}==10));then
break
fi
done
echo ${array[@]}