云计算之正则表达式

举报
tea_year 发表于 2024/08/26 21:42:45 2024/08/26
【摘要】 正则表达式1. 什么是正则表达式正则表达式(Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指定的字符。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。支持正...

正则表达式

1. 什么是正则表达式

正则表达式(Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指定的字符。

许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。

正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。

支持正则表达式的程序如:locate |find| vim| grep| sed |awk

2. 第一类正则

  • 名词解释:

元字符:指那些在正则表达式中具有特殊意义的专用字符,如:点(.) 星(*) 问号(?)等

前导字符:即位于元字符前面的字符 abc* aooo.

  • 正则中常用的元字符

示例文本:

 [root@server ~]# cat 1.txt
 ggle
 gogle
 google
 gooogle
 goooooogle
 gooooooogle
 taobao.com
 taotaobaobao.com
 ​
 jingdong.com
 dingdingdongdong.com
 10.1.1.1
 Adfjd8789JHfdsdf/
 a87fdjfkdLKJK
 7kdjfd989KJK;
 bSKJjkksdjf878.
 cidufKJHJ6576,
 ​
 hello world
 helloworld yourself


 (1).        任意单个字符,除了换行符 
 (2)*        前导字符出现0次或连续多次  ab*能匹配“a”,“ab”以及“abb”,但是不匹配“cb”
 (3).*       任意长度的字符  ab.*  ab123 abbb abab
 (4)^        行的开头
 (5)$        行的结尾
 (6)^$       空行
 ​
 ​
 (7)[]       匹配指定字符组内的任一单个字符   [abc]
 (8)[^]  匹配不在指定字符组内的任一字符     [^abc]
 ​
 (9)^[]  匹配以指定字符组内的任一字符开头   ^[abc]
 (10)^[^]    匹配不以指定字符组内的任一字符开头  ^[^abc] 
 ​
 ​
 ​
 (11)\<      取单词的头
 (12)\>      取单词的尾
 (13)\<\>        精确匹配符号  grep -w 'xxx'
 ​
 ​
 (14)\{n\}   匹配前导字符连续出现n次    go\{2\}   google  gooogle
 (15)\{n,\}  匹配前导字符至少出现n次 
 (16)\{n,m\} 匹配前导字符出现n次与m次之间 
 ​
 ​
  (17) \(strings\)   保存被匹配的字符
 ​
 ​
 将192.168.0.254 换成 192.168.1.254
 vim 1.txt
 :%s#\(192\.168\)\.0\.\(254\)#\1\.100\.\2    //底行模式下匹配
 将10.1.1.1替换成10.1.1.254
 :%s#\(10.1.1\).1#\1.254#g 
 :%s/\(10.1.1\).1/\1.254/g 
 ​
 # sed -n 's#\(192\.168\)\.0\.254#\1\.1\.254#p'      
 找出含有192.168的行,同时保留192.168并标记为标签1,之后可以使用\1来引用它。最多可以定义9个标签,从左边开始编号,最左边的是第一个。
 ​
 [root@server shell05]# sed -n 's#10.1.1.1#10.1.1.254#p' 1.txt
 10.1.1.254
 [root@server shell05]# sed -n 's#\(10.1.1\).1#\1.254#p' 1.txt
 10.1.1.254
 ​
 将helloworld yourself 换成hellolilei myself
 ​
 vim 1.txt
 :%s#\(hello\)world your\(self\)#\1lilei my\2#g
 ​
 # sed -n 's/\(hello\)world your\(self\)/\1lilei my\2/p' 1.txt 
 hellolilei myself
 ​
 [root@server shell05]# sed -n 's/helloworld yourself/hellolilei myself/p' 1.txt 
 hellolilei myself
 [root@server shell05]# sed -n 's/\(hello\)world your\(self\)/\1lilei my\2/p' 1.txt 
 hellolilei myself
 ​
 ​
 ​
 [0-9] [a-z] [A-Z] [a-zA-Z] [a-Z]
 =================================================================================
 Perl内置正则:
 \d      匹配数字  [0-9]
 \w      匹配字母数字下划线[a-zA-Z0-9_]
 \s      匹配空格、制表符、换页符[\t\r\n]
 ​
 #grep -P '\d' test.txt
 #grep -P '\w' test.txt
 #grep -P '\s' test.txt
 ​
 ​
  • 扩展类的正则表达式 grep -E 或则 egrep

 扩展正则表达式元字符
 +           匹配一个或多个前导字符     bo+ boo bo
 ?           匹配零个或一个前导字符     bo? b bo
 ​
 a|b     匹配a或b
 ()          组字符    hello myself yourself     (my|your)self
 ​
 {n}     前导字符重复n次            \{n\}
 {n,}        前导字符重复至少n次    \{n,\}
 {n,m}       前导字符重复n到m次      \{n,m\}
 ​
 ​
 # grep "root|ftp|adm" /etc/passwd
 # egrep "root|ftp|adm" /etc/passwd
 # grep -E "root|ftp|adm" /etc/passwd
 ​
 # grep -E 'o+gle' test.txt 
 # grep -E 'o?gle' test.txt 
 ​
 # egrep 'go{2,}' 1.txt
 # egrep '(my|your)self' 1.txt
 ​
 ​
 [root@jumper shell06]# grep '[0-9]\{2\}\.[0-9]\{1\}\.[0-9]\{1\}\.[0-9]\{1\}' 1.txt 
 10.1.1.1
 [root@jumper shell06]# grep '[0-9]{2}\.[0-9]{1}\.[0-9]{1}\.[0-9]{1}' 1.txt 
 [root@jumper shell06]# grep -E '[0-9]{2}\.[0-9]{1}\.[0-9]{1}\.[0-9]{1}' 1.txt 
 10.1.1.1
 [root@jumper shell06]# grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' 1.txt 
 10.1.1.1
 [root@jumper shell06]# grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt 
 10.1.1.1
 ​


3. 第二类正则

表达式 功能 示例
[:alnum:] 字母与数字字符 [[:alnum:]]+
[:alpha:] 字母字符(包括大小写字母) [[:alpha:]]{4}
[:blank:] 空格与制表符 [[:blank:]]*
[:digit:] 数字 [[:digit:]]?
[:lower:] 小写字母 [[:lower:]]{4,}
[:upper:] 大写字母 [[:upper:]]+
[:punct:] 标点符号 [[:punct:]]
[:space:] 包括换行符,回车等在内的所有空白 [[:space:]]+
[root@server shell05]# grep -E '^[[:digit:]]+' 1.txt
[root@server shell05]# grep -E '^[^[:digit:]]+' 1.txt
[root@server shell05]# grep -E '[[:lower:]]{4,}' 1.txt


4. 课堂作业

 在自己虚拟机里创建如下内容的文件:
 # cat test.txt 
 Aieur45869Root0000
 9h847RkjfkIIIhello
 rootHllow88000dfjj
 8ikuioerhfhupliooking
 hello world
 192.168.0.254
 welcome to uplooking.
 abcderfkdjfkdtest
 rlllA899kdfkdfj
 iiiA848890ldkfjdkfj
 abc
 12345678908374
 123456@qq.com
 123456@163.com
 abcdefg@itcast.com23ed

要求如下:

 1、查找不以大写字母开头的行(三种写法)。
 2、查找有数字的行(两种写法)
 3、查找一个数字和一个字母连起来的
 4、查找不以r开头的行
 5、查找以数字开头的
 6、查找以大写字母开头的
 7、查找以小写字母开头的 
 8、查找以点结束的
 9、去掉空行
 10、查找完全匹配abc的行
 11、查找A后有三个数字的行
 12、统计root在/etc/passwd里出现了几次
 13、用正则表达式找出自己的IP地址、广播地址、子网掩码
 ifconfig eth0|grep Bcast|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
 ifconfig eth0|grep Bcast| grep -E -o '([0-9]{1,3}.){3}[0-9]{1,3}'
 ifconfig eth0|grep Bcast| grep -P -o '\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}'
 ifconfig eth0|grep Bcast| grep -P -o '(\d{1,3}.){3}\d{1,3}'
 ifconfig eth0|grep Bcast| grep -P -o '(\d+.){3}\d+'
 ​
 # egrep --color '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/sysconfig/network-scripts/ifcfg-eth0
 IPADDR=10.1.1.1
 NETMASK=255.255.255.0
 GATEWAY=10.1.1.254
 ​
 # egrep --color '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' /etc/sysconfig/network-scripts/ifcfg-eth0 
 IPADDR=10.1.1.1
 NETMASK=255.255.255.0
 GATEWAY=10.1.1.254
 ​
 ​
 14、找出文件中的ip地址并且打印替换成172.16.2.254
 grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt |sed -n 's/192.168.0.\(254\)/172.16.2.\1/p'
 ​
 15、找出文件中的ip地址
 grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt
 ​
 16、找出全部是数字的行
 grep -E '^[0-9]+$' test
 17、找出邮箱地址
 grep -E '^[0-9]+@[a-z0-9]+\.[a-z]+$'
 ​
 ​
 grep --help:
 匹配模式选择:
 Regexp selection and interpretation:
   -E, --extended-regexp     扩展正则
   -G, --basic-regexp        基本正则
   -P, --perl-regexp         调用perl的正则
   -e, --regexp=PATTERN      use PATTERN for matching
   -f, --file=FILE           obtain PATTERN from FILE
   -i, --ignore-case         忽略大小写
   -w, --word-regexp         匹配整个单词
   

五、正则总结

元字符:在正则中,具有特殊意义的专用字符。. *

前导字符:元字符前面的字符叫前导字符

元字符 字符说明 示例
* 前导字符出现0次或者连续多次 ab* abbbb
. 除了换行符以外,任意单个字符 ab. ab8 abu
.* 任意长度的字符 ab.* adfdfdf
[] 括号里的任意单个字符或一组单个字符 [abc][0-9][a-z]
[^] 不匹配括号里的任意单个字符或一组单个字符 [^abc]
^[] 匹配以括号里的任意单个字符开头 ^[abc]
\^[^] 不匹配以括号里的任意单个字符开头
^ 行的开头 ^root
$ 行的结尾 bash$
^$ 空行
\{n\}和{n} 前导字符连续出现n次 [0-9]\{3\}
\{n,\}和{n,} 前导字符至少出现n次 [a-z]{4,}
\{n,m\}和{n,m} 前导字符连续出现n-m次 go{2,4}
\<\> 精确匹配单词 \<hello\>
\(\) 保留匹配到的字符 \(hello\)
+ 前导字符出现1次或者多次 [0-9]+
? 前导字符出现0次或者1次 go?
| \^root|\^ftp
() 组字符 (hello|world)123
\d perl内置正则 grep -P \d+
\w 匹配字母数字下划线

六、课后作业

写一个自动搭建apache服务的脚本,要求如下: 1、用户输入web服务器的IP、域名以及数据根目录 2、如果用户不输入则一直提示输入,直到输入为止 3、当访问www.test.cc时可以访问到数据根目录里的首页文件“this is test page”

 参考:
 #!/bin/bash
 conf=/etc/httpd/conf/httpd.conf
 input_fun()
 {
   input_var=""
   output_var=$1
   while [ -z $input_var ]
     do
     read -p "$output_var" input_var
     done
     echo $input_var
 }
 ipaddr=$(input_fun "Input Host ip[192.168.0.1]:")
 web_host_name=$(input_fun "Input VirtualHostName [www.test.cc]:")
 root_dir=$(input_fun "Input host Documentroot dir:[/var/www/html]:")
 ​
 [ ! -d $root_dir ] && mkdir -p $root_dir
 chown apache.apache $root_dir && chmod 755 $root_dir
 echo this is $web_host_name > $root_dir/index.html
 echo "$ipaddr $web_host_name" >> /etc/hosts
 ​
 [ -f $conf ] && cat >> $conf <<end
 NameVirtualHost $ipaddr:80
 <VirtualHost $ipaddr:80>
     ServerAdmin webmaster@$web_host_name
     DocumentRoot $root_dir
     ServerName $web_host_name
     ErrorLog logs/$web_host_name-error_log
     CustomLog logs/$web_host_name-access_loh common
 </VirtualHost>
 end
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。