; linux基础之正则表达式 | Linux运维部落

linux基础之正则表达式

正则

正则表达式

作用:用来进行行文本匹配的工具[grep、sed、awk、vim、less、nginx、varnaish]
基本正则匹配选项必须用”“起来:
  • <^> 匹配字符串的开始
  • <$> 匹配字符串的结束。
  • <.>匹配除了换行符任意字符
  • <+> 匹配重复1次或更多次
  • <?>重复0次或1次
  • {n} 重复n次
  • {n,} 重复n次或更多次
  • {n,m} 重复n到m次
  • \<或者\b 词首锚定 >或者\b词尾锚定
  • (xxx) 分组:将一个或多个字符绑定在一起进行处理注意匹配到的(内容而非正则本身)会被正则表达式引擎记录与内部变量中,可被后续调用\1,\2
  • | 或者:a|b a或b
  • [:alnum:] 字母和数字
  • [:alpha:] 任何大小写字符A-Z a-z
  • [:digit:] 十进制数[:xdigit:] 十六进制
  • [:lower:] 小写字母 [:upper:] 大写字母
  • [:blank:] 空白字符(空格和制表符)
  • [:space:] 水平和垂直的空白字符
  • [:punct:] 标点符号
  • [任意要匹配的字符] 会递归取出
注意:通配符不支持[:xxx:]这种格式
扩展正则:匹配选项必须用”“起来
  • <\b>单词的开头或结尾,单词的分界处。举例:hi后面跟着lucy,\bhi\b.*\blucy\b \bx{n次}\b
  • <*>匹配任意次0次或多次,前面的内容可以连续重复使用任意次以使整个表达式得到匹配
  • <\d>匹配一位数字,为了避免重复可以使用\d{n}必须连续重复n次–只有python正则支持
  • <\w> 匹配字母或数字或下划线或汉字。
  • <\s> 匹配任意的空白符-
  • <^> 匹配字符串的开始
  • <$> 匹配字符串的结束。
  • <.>匹配除了换行符任意字符
  • <+> 匹配重复1次或更多次
  • <?>重复0次或1次
  • {n} 重复n次
  • {n,} 重复n次或更多次
  • {n,m} 重复n到m次
  • [任意要匹配的字符] 会递归取出
注意:与基本正则基本相同,只不过一些特殊符号不用再使\进行转义,当然有些特例:单词锚定和分组的后向引用仍需要\b \< \1.

举例&作业:
Windows\d+匹配Windows后面跟1个或更多数字
匹配电话号码:虽然可以匹配到,但是有一部分不是我们想要的结果所以可以用下面的分支条件来解决
[root@station88 src]# egrep ‘\(?[0-9]{3}[)-]?[0-9]{8}’ test.txt
233-39432434
(010)66513114
022-22333434
010)12345678
(022-66513115
作业:
1、显示三个用户root、mage、wang的UID和默认shell
[root@localhost lee]# cut -d: -f1,3,7 –output-delimiter = /etc/passwd|egrep “root|mage|wang”
root=0=/bin/bash
mage=515=/bin/bash
wang=516=/sbin/nologin
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包 括下划线)后面跟一个小括号的行
[root@localhost lee]# egrep “^[[:alpha:]].*[[:punct:]]*\(\)” /etc/rc.d/init.d/functions
fstab_decode_str() {
checkpid() {
daemon() {
killproc() {
pidfileofproc() {
pidofproc() {
status() {
echo_success() {
echo_failure() {
echo_passed() {….
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
[root@localhost lee]# echo /etc/rc.d/init.d/functions |egrep -o “\b[[:alpha:]]*\b$”
functions
4、使用egrep取出上面路径的目录名
[root@localhost lee]# echo /etc/rc.d/init.d/functions |egrep -o “([[:punct:]]).*\1”
/etc/rc.d/init.d/
5、统计last命令中以root登录的每个主机IP地址登录次数
[root@localhost lee]# last |grep “root” |tr -s ” “|cut -d\ -f1,3 |sort |uniq -c|sort -nr
26 root 192.168.162.1
4 root :0.0
3 root pxe31.magelinux.
2 root pxe73.magelinux.
2 root :0
1 root 172.16.253.31
1 root 172.16.252.41
1 root 172.16.252.1
6、利用扩展正则表达式分别表示0-9、10-99、100-199、 200-249、250-255
#echo {1..255} > 1.txt
#egrep -o “\b[0-9]\b” 1.txt
#egrep -o “\b[0-9]{2}\b” 1
#egrep -o “\b[0-9]{2}\b” 1 |less
#egrep -o “\b1[0-9]{2}\b” 1 |less
#egrep -o “\b2[0-4][0-9]\b” 1 |less
#egrep -o “\b25[0-5]\b” 1 |less
7、显示ifconfig命令结果中所有IPv4地址
8、将此字符串:welcome to magedu linux 中的每个字符 去重并排序,重复次数多的排到前面
[root@localhost lee]# echo “welcome to magedu linux”|egrep -o “[[:alpha:]]”|sort|uniq -c|sort -nr
3 e
2 u
2 o
2 m
2 l
1 x
1 w
1 t
1 n
1 i
1 g
1 d
1 c
1 a
分支条件:
如果满足其中任意一种规则都应当成功匹配,使用方法用|把不同的规则分隔开。
[root@station88 src]# egrep ‘\([0-9]{3}\)[0-9]{8}|^[0-9]{3}-[0-9]{8}’ test.txt
233-39432434
(010)66513114
022-22333434
分组:过滤ip地址(搞定部分)
ifconfig eth0|egrep -o “([0-1][0-9][0-9]|2[0-5][0-4])\.([0-1][0-9][0-9]|2[0-5][0-4])\.([0-1][0-9][0-9]|2[0-5][0-4])\.([0-1][0-9][0-9]|2[0-5][0-4])”(分组引用为匹配结果的引用而非规则本身)
简化:ifconfig eth0|egrep -o “([0-1][0-9][0-9].|2[0-5][0-4].){3}[0-1][0-9][0-9]|2[0-5][0-4]”
反义:
* \W匹配任意不是字母数字下划线汉字的字符。
* \S匹配任意不是空白符的字符
* \D匹配任意非数字的字符
* \B匹配不是单词开头或结束的位置
* [^x]匹配除了x以外的任意字符
* [^aeiou]匹配除了aeiou这几个字母以外的任意字符。
* 举例:
* [root@station88 src]# egrep ‘^[^0-9].*[^0-9]$’ test.txt
* h,hihihihihiLucy
* iiiiiii
向后引用:
* 使用()指定一个分组后,默认分组会自动拥有一个组号,1….
* 向后引用用于重复搜索前面某个分组匹配的文本。\1匹配分组1
* 例如:\b(w+)\b\s+\1\b 可匹配重复的单词go go go
* 也可以指定表达式的组名。(?<world>\w+)=(?’world’\w+),将祖名指定为world–实验失败
断言:
* 概念:像\b,^,$这样用于指定一个位置,这个位置满足一定过的条件。

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/86949

发表评论

电子邮件地址不会被公开。 必填项已用*标注

评论列表(2条)

  • 助教-汤哥
    助教-汤哥 2017-09-13 10:59

    记录内容不错,可以对不记得的内容做一个备注,为了更好的复习。

  • 娅娃爱 2017-11-06 13:26

    给一个大的赞,治好了我多年的正则恐惧症!

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班