Shell编程及自动化运维实现—第5章—三剑客(一正则表达式) .

目录

一前言

1 名词解释

2 工具

3 场景

4 回顾示例

二 元字符

1 定义

2 分类

==基本正则表达式元字符==

^  $  *  .   .*  []  [-]  [^]  \  \<   \>   ()   x\{m\)}  x\{m,\}   x\{m,n\}    

==扩展正则表达式元字符==

+  ?   a|b   ()

示例:

示例2


一前言

1 名词解释

正则表达式(regular expression, RE)是一种字符模式,用于在查找过程中匹配指定的字符。
在大多数程序里,正则表达式都被置于两个正斜杠之间;例如/l[oO]ve/就是由正斜杠界定的正则表达式,
它将匹配被查找的行中任何位置出现的相同模式。在正则表达式中,元字符是最重要的概念。

2 工具

yum   sed   awk   grep调用

3 场景

mysql、oracle、php、python ,Apache,Nginx...  需要正则

4 回顾示例

需求:

    匹配数字的脚本:用户输入创建账号的数量

语法:
    [[ ^[0-9]+$ ]]

示范:
read -p "输入数字才退出:  " num

while :
do

if [[ ! $num =~ ^[0-9]+$ ]];then
        echo "error enter!"
        read -p "输入数字才退出:" num
else
        echo "thank you"
        exit 1
fi

done

二 元字符

1 定义

定义:元字符是这样一类字符,它们表达的是不同于字面本身的含义

2 分类

==基本正则表达式元字符==

^  $  *  .   .*  []  [-]  [^]  \  \<   \>   ()   x\{m\)}  x\{m,\}   x\{m,n\}    

  ^   // 行首定位符:
# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

# grep "^root" /etc/passwd
为什么什么少一行?
root:x:0:0:root:/root:/bin/bash

    $       行尾定位符
 love$

   .      匹配任意单个字符
# grep abc 1.txt
abc
# grep adc 1.txt
adc
# grep a.c 1.txt
abc
adc

    *     匹配前导符0到多次   
# cat 1.txt 
a
ab
abc
abcd
abcde
abcdef
ggg
hhh
iii 
# grep "abc*" 1.txt 
ab
abc
abcd
abcde
abcdef
# grep "abcd*" 1.txt 
abc
abcd
abcde
abcdef

 

    .*        任意多个字符
# grep ".*" 1.txt 
a
ab
abc
abcd
abcde
abcdef
ggg
hhh
iii
为什么*.不好使?

    [ ]      匹配指定范围内一个字符
 [lL]ove
# cat 1.txt 
love
Love
1ove
iove
# grep [lL]ove 1.txt 
love
Love

    [ - ]
        匹配指定范围内的一个字符,连续的范围
[a-z0-9]ove         //[a-Z]=[a-zA-Z]
# cat 1.txt 
love
Love
1ove
iove

# grep [0-9] 1.txt 
1ove

# grep [a-z]ove 1.txt 
love
iove

# grep [a-Z]ove 1.txt 
love
Love
iove

    [^]        匹配不在指定组内的字符
[^a-z0-9]ove          //取反
# cat 1.txt 
love
Love
1ove
iove

# grep "[^a-z]ove" 1.txt 
Love
1ove

# grep "[^0-9]ove" 1.txt 
love
Love
iove

    \      用来转义元字符    (''   ""    \),脱意符
  # grep "l." 1.txt 
love
l.ve

# grep "l\." 1.txt 
l.ve

  \<        词首定位符
# grep "love" 1.txt 
love
iloveyou

# grep "\<love" 1.txt 
love

 ^    \< 的区别
# cat 1.txt 
i loveyou
loveyou

# grep "\<love" 1.txt 
i loveyou
loveyou

# grep "^love" 1.txt 
loveyou

    \>        词尾定位符
               love\>
    ()
              \(..\)
匹配稍后使用的字符的标签
             :3,9 s/\(.*\)/#\1/    加注释

   x\{m\}        字符x重复出现m次   
# grep o 1.txt
love
loove
looove
# grep "o\{3\}" 1.txt     
looove

   x\{m,\}        字符x重复出现m次以上
            o\{5,\}

    x\{m,n\}      字符x重复出现m到n次  
            o\{5,10\}
# egrep "o{4,5}" 1.txt 
oooo
ooooo
ioooo
ooooi
iooooi
# egrep "o{5,5}" 1.txt 
ooooo

==扩展正则表达式元字符==

+  ?   a|b   ()

    +      匹配1~n个前导字符
# cat 1.txt
lve
love
loove
# egrep lo+ve 1.txt
love
loove

    ?      匹配0~1个前导字符
 lo?ve :?前面的o 有还是没有,都行!
# egrep lo?ve tom.sh 
love
lve

    a|b        匹配a或b

# egrep "o|v" 1.txt 
lve
1ove
loove
looove
loeve
love
Love
iloveyou
l.ve
o
oo
ooo
oooo
ooooo

ioooo
oooo
i
iooooi

    ()        组字符
# egrep "loveable|rs" 1.txt 
rs
loveable
lovers
# egrep "love(able|rs)" 1.txt 
loveable
lovers

示例:

grep   love    1.txt    找love

/^love/    以love开头

/love$/    以love结尾

/l.ve/    l开始,一个任意字符,ve结尾

/lo*ve/    l开始,零个或多个o,ve结尾

/[Ll]ove/    大L 或者小L 开头的  ove

/love[a-z]/    love最后一个小写字母

/love[^a-zA-Z0-9]/    love最后一个(不是字母或者数字),而是符号
# egrep  "love[^a-zA-Z0-9]" 1.txt 
love,
love?

示例2

/.*/     所有行
# egrep ".*" 1.txt | wc

/^$/    空行

/^[A-Z]..$/    开头一个大写,最后2个任意字符

/^[A-Z][a-z ]*3[0-5]/    一个大写开头,0到多个小写或空格,3,最后是0-5的一个数字

/[a-z]*\./    0到多个小写字母,最后一个点

/^ *[A-Z][a-z][a-z]$/        0到多个空格开头,一个大写,一个小写,再一个小写结尾

/^[A-Za-z]*[^,][A-Za-z]*$/    0到多个字母开头,非逗号,0到多个英文结尾c

/\<fourth\>/    找个单词

/\<f.*th\>/    找单词

/5{2}2{3}\./    5两次2三次和一个点

/^[ \t]*$/    0到多个 ,空格或tab的行

/^#/    井号开头的行

/^[ \t]*#/    有0到多个,空格或者tab开头的行,的注释行

:1,$ s/\([Oo]ccur\)ence/\1rence/        多个r

:1,$ s/\(square\) and \(fair\)/\2 and \1/        换个位置

 

 

 

 

 

 

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

yun小八

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值