您的位置:首页 > 运维架构 > Shell

shell入门之----正则表达式

2020-04-19 23:00 573 查看

正则表达式RE

正则表达式基本元字符

正则表达式拓展元字符

用来处理文本

正则表达式(Regular Expression, RE)是一种字符模式, 用于在查找过程中匹配指定的字符. 在大多数程序里, 正则表达式都被置于两个正斜杠之间;

例如/l[oO]ve/就是由正斜杠界定的正则表达式, 它将匹配被查找的行中任何位置出现的相同模式. 在正则表达式中,元 字符是最重要的概念

元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定 其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

No.1 正则表达式基本元字符
基本正则表达式元字符
元字符
示例                      功能
^                       行首定位符
^love
$                       行尾定位符
love$
.                       匹配单个字符
l..e
*                       匹配前导符0到多次
ab*love
.*                      匹配任意多个字符
[]                      匹配方括号中任意一个字符
[lL]ove
[ - ]                   匹配指定范围内的一个字符
[a-z0-9]ove
[^]                     匹配不在指定组里的字符
[^a-z0-9]ove
\                       用来转义元字符
love\.
\<                      词首定位符
\<love
\>                      词尾定位符
love\>
\(\)                    匹配后的标签
No.2正则表达式拓展元字符
扩展正则表达式元字符
+                       匹配一个或多个前导字符
[a-z]+ove
?                       匹配零个或一个前导字符
lo?ve
a|b                     匹配a或b
love|hate
()                      组字符loveable|rs
love(able|rs) ov+ ov+ (ov)+
(..)(..)\1\2            标签匹配字符
(love)able\1er
x{m}                    字符x重复m次
o{5}
x{m,}                   字符x重复至少m次
o{5,}
x{m,n}                  字符x重复m到n次
o{5,10}

shell 编程-grep

egrep 支持正则表达式的拓展元字符
#egrep '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' file1.txt
[root@newrain ~]# num1=1
运用正则,判断需要[[ ]]
[root@newrain ~]# [[ $num1 =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
yes
[root@newrain ~]# num3=1b1
[root@newrain ~]# [[ $num3 =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
no
[root@newrain ~]# [[ $num =~ ^[0-9]\.[0-9]+$ || $num =~ ^[0-9]+$ ]] && echo "yes" || echo "no"       //输入的只能是数字(包括小数)

* 0或多个
[root@newrain ~]# useradd abrt
[root@newrain ~]# grep 'abc*' /etc/passwd
abrt:x:1041:1041::/home/abrt:/bin/bash

\< 词首定位符号 \>词尾定位符号
[root@newrain ~]# cat jack.txt
Jack JACK JAck jackly
:% s/\<[Jj]ack\>/123/g

^以什么开头
[root@newrain ~]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash

$以什么结尾
[root@newrain ~]# grep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
confluence:x:1000:1000:Atlassian Confluence:/home/confluence:/bin/bash
to:x:1003:1003::/home/to:/bin/bash

. 匹配单个字符
[root@newrain ~]# grep 'r..t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
[root@newrain ~]# grep 'r.t' /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

.* 任意多个字符
[root@newrain ~]# grep 'r.*t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
abrt:x:1041:1041::/home/abrt:/bin/bash
[] 匹配方括号中的任意一个字符
[root@newrain ~]# grep 'Root' /etc/passwd
[root@newrain ~]# grep '[Rr]oot' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin

[ - ] 匹配指定范围内的一个字符
[root@newrain ~]# grep [a-z]oot /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin

[^] 匹配不在指定组内的字符,非得意思
[root@newrain ~]# grep '[^0-9]oot' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin

[root@newrain ~]# grep '[^0-9A-Z]oot' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
[root@newrain ~]# grep '[^0-9A-Za-z]oot' /etc/passwd
[root@newrain ~]#
[root@newrain ~]# useradd Root
[root@newrain ~]# grep '[a-z]oot' /etc/passwd      //a-z 包含大写
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin Root:x:1042:1042::/home/Root:/bin/bash
[root@newrain ~]# grep '^[rc]oot' /etc/passwd
root:x:0:0:root:/root:/bin/bash
^在[]内表示取反,^在[]外表示以什么开头

\(\)匹配后的标签
[root@newrain ~]# cat file1.txt
IPADDR=192.168.1.123
GATEWAY=192.168.1.1
NETMASK=255.255.255.0
DNS=114.114.114.114
:% s/\(192.168.1.\)123/\12/
:% s/\(192.\)\(168.\)\(1.\)2/\1\2\35/
:% s/\(192.\)\(168.\)\(1.\)\(5\)/\1\26.\4/

扩展正则表达式元字符
+                       匹配一个或多个前导字符
[a-z]+ove
?                       匹配零个或一个前导字符
lo?ve
a|b                     匹配a或b
love|hate
(..)(..)\1\2            标签匹配字符
(love)able\1er
x{m}                    字符x重复m次
o{5
x{m,}                   字符x重复至少m次
o{5,}
x{m,n}                  字符x重复m到n次
o{5,10}
+ 匹配一个或多个前导字符
[root@newrain ~]# egrep 'ro+t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
? 匹配零个或一个前导字符
[root@newrain ~]# egrep 'ro?t' /etc/passwd
abrt:x:1041:1041::/home/abrt:/bin/bash

a|b    匹配a或b
[root@newrain ~]# netstat -anlp|egrep ':80|:22'
[root@newrain ~]# egrep 'root|alice'
/etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin d
ockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
x{m} 字符x重复m次
[root@newrain ~]# cat a.txt
love
love.
loove
looooove
[root@newrain ~]# egrep 'o{2}' a.txt
loove
looooove
[root@newrain ~]# egrep 'o{2,}' a.txt
loove
looooove
[root@newrain ~]# egrep 'o{6,7}' a.txt
  • 点赞
  • 收藏
  • 分享
  • 文章举报
(帽子先生)牛角尖 发布了32 篇原创文章 · 获赞 5 · 访问量 2131 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: