zoukankan      html  css  js  c++  java
  • Shell函数和正则表达式

    1. shell函数

      shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数。给这段代码起个名字称为函数名,后续可以直接调用该段代码。

      格式:

        func() {   #指定函数名

        command    #函数体

        }

      

    Shell 函数很简单,函数名后跟双括号,再跟双大括号。通过函数名直接调用,不加小括号。

    #显示文本颜色
    [root@localhost ~]# vim test.sh
    #!/bin/bash
    fun (){
            for i in {32..39}
            do
                    echo -e "33[${i}mHello World33[0m"
            done
    }
    fun
    :wq
    [root@localhost ~]# bash test.sh
    Hello World
    Hello World
    Hello World
    Hello World
    Hello World
    Hello World
    ……
    #函数返回值
    [root@localhost ~]# vim test1.sh
    #!/bin/bash
    fun () {
            echo "1"
            return 2
            echo "3"
    }
    fun
    [root@localhost ~]# bash test1.sh
    1
    

    #return 在函数中定义状态返回值,返回并终止函数,但返回的只能是 0-255 的数字,类似于 exit。 [root@localhost ~]# vim test1.sh #!/bin/bash fun () { echo "1" exit 2 } fun :wq [root@localhost ~]# bash test1.sh 1 [root@localhost ~]# echo $? 2
    #函数传参
    [root@localhost ~]# vim test1.sh
    #!/bin/bash
    fun () {
            echo "Hello $1"
    }
    fun world
    :wq
    [root@localhost ~]# bash test1.sh
    Hello world

     

    2. shell正则表达式

      正则表达式在每种语言中都会有,功能就是匹配符合你预期要求的字符串。

      Shell 正则表达式分为两种:

        基础正则表达式

        扩展正则表达式:扩展的表达式有+、?、| 和()

       正则表达式就是为了处理大量的文本、字符串而定义的一套规则和方法

      通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。Linux正则表达式一般以行为单位处理。

      1> 正则表达式和通配符的本质区别

      1)不需要思考的判断方法:在三剑客awk,sed,grep,egrep都是正则,其他都是通配符

      2)区别通配符和正则表达式最简单的方法:

      (1)文件目录名===>通配符
           (2)文件内容(字符串,文本【文件】内容)===>正则表达式

    以grep工具说明常用正则表达式:

    符号

    描述

    实例

    .

    一个点.匹配任意单个字符(必须存在)

    例子:l..e   #匹配任意两个

    可以表示

    love

    like

    leee

    不可以表示的

    labcde

    le

    lee

    [root@localhost ~]# cat zhengze

    like

    love

    lect

    [root@localhost ~]# cat zhengze | grep "l..e"

    like

    love

    ^

    匹配前面字符串开头

    匹配abc开头的行

    [root@localhost ~]# cat zhngze

    abc you love me

    i love you abc

    [root@localhost ~]# cat zhngze | grep "^abc"

    abc you love me

    $

    匹配前面字符串结尾

    匹配abc结尾的行

    [root@localhost ~]# cat zhngze

    abc you love me

    i love you abc

    [root@localhost ~]# cat zhngze | grep "abc$"

    i love you abc

     

    过滤掉空行

    [root@localhost ~]# cat a

    123fsasf12

                                    #空行

    fasfdsadfsa

    adasfa12

    123ddfs

    167dsaf

    daf

    [root@localhost ~]# cat a | grep -v "^$"#去空行

    123fsasf12

    fasfdsadfsa

    adasfa12

    123ddfs

    167dsaf

    daf

    *

    匹配前一个字符的零个或多个

    a*  表示出现任意个a的情况

    [root@localhost ~]# cat t | grep "a*"

    abcaa

    bcacd

    aaabc

    cbda

    zxcv

    [root@localhost ~]# cat t | grep -o "a*"

    a

    aa

    a

    aaa

    a

    a*b 表示b前面有任意个a的情况(可以是0个)

    [root@localhost ~]# cat t | grep  "a*b"

    abcaa

    bcacd

    aaabc

    cbda

    [root@localhost ~]# cat t | grep -o  "a*b"

    ab

    b

    aaab

    b

    .* 

    表示任意长度的任意字符

    例子:过滤出一行中a在前,b在后的行

    条件:

    包含 a 和 b

    字母 a 必须在 b前面

    [root@localhost ~]# cat t

    abcaa

    bcacd

    aaabc

    cbda

    zxcv

    [root@localhost ~]# cat t | grep "a.*b"

    abcaa

    aaabc

    +(扩展正则)

    表示其前面的字符出现最少一次的情况

    [root@localhost ~]# cat t

    abcaacdfabvfab

    bcacd

    aaabc

    cbda

    zxcv

    [root@localhost ~]# cat t | grep -E "ab+"

    abcaacdfabvfab

    aaabc

    [root@localhost ~]# cat t | egrep "ab+"

    abcaacdfabvfab

    aaabc

    [root@localhost ~]# cat t | grep "ab+"  #要正则

    [root@localhost ~]#

    ?

    (扩展正则)

    表示其前面的字符出现最多一次的情况(可以0个

    匹配ac或c(c前面出现的a为0或多个,ac相连)

    [root@localhost ~]# cat t

    abcaacdfabvfab

    bcacd

    aaabc

    cbda

    zxcv

    [root@localhost ~]# cat t | grep "a?c"

    [root@localhost ~]# cat t | egrep "a?c"

    abcaacdfabvfab

    bcacd

    aaabc

    cbda

    zxcv

    [ ]

    表示范围内的一个字符

    [root@localhost ~]# cat a

    123fsasf12

    fasfdsadfsa

    adasfa12

    123ddfs

    167dsaf

    daf

    以a-z开头(字母开头)

    [root@localhost ~]# cat a | grep "^[a-z]"

    fasfdsadfsa

    adasfa12

    daf

    [ .-.]

    匹配中括号中范围内的任意一个字符

    匹配所有字母

    echo -e "a b c" | grep '[a-z]'

    [^]

    匹配[^字符]之外的任意一个字符

    [root@localhost ~]# cat a

    123fsasf12

    fasfdsadfsa

    adasfa12

    123ddfs

    167dsaf

    daf

    [root@localhost ~]# cat a | grep "^[^a-z]"

    #不以字母开头的文件

    123fsasf12

    123ddfs

    167dsaf

    {n}或者{n,}

    {n}表示严格匹配n个字符

    {n,}匹配花括号前面字符至少 n个字符

    [root@localhost ~]# cat b

    bbbasdfhhf

    bb1235sdf

    babababba

    agdsaf

    asdf

    [root@localhost ~]# cat b | grep "b{2}"

    bbbasdfhhf

    bb1235sdf

    babababba

    [root@localhost ~]# cat b | grep "b{3,}"

    #至少3个

    bbbasdfhhf

    [root@localhost ~]# cat b | egrep "b{3,}"

    bbbasdfhhf 

     

    规则一:花括号和分组在基础正则中需要加上斜线进行转义,但是在扩展正则中不要加斜线

    {n,m}

    匹配花括号前面字符至少 n个字符,最多 m 个字符

    [root@localhost ~]# cat b | egrep "b{2,3}a"

    #a前面至少2个b最多3个b

    bbbasdfhhf

    babababba

    [root@localhost ~]# cat b | egrep "fh{2,}f"

    #f和f之间最少2个h

    bbbasdfhhf

    [root@localhost ~]# cat b | egrep "as{,1}f"

    #a到f之间最多1个s

    agdsaf

    <

    锚定单词首部(单词一般以空格或特殊字符做分隔)

    [root@localhost ~]# cat c

    df:ceroot:fasdf:rootvdga

    agd dsaf rootadg dagaggd

    sfafa afdarootadf agdag

    [root@localhost ~]# cat c | grep "<root"

    #以特殊字符分割,首部为root

    df:ceroot:fasdf:rootvdga

    agd dsaf rootadg dagaggd

    >

     锚定单词尾部(单词一般以空格或特殊字符做分隔)

    [root@localhost ~]# cat c | grep "root>"

    #以特殊字符分割,尾部为root

    df:ceroot:fasdf:rootvdga

    ( )

    1  调用前面的第一个分组

    [root@localhost ~]# cat d

    efdgfd1fasdf1

    1aefeeea2dfg

    3fdavfdva3fggfdf

    33dfagqr23zdfbd

    abffsh23sfg

    [root@localhost ~]# cat d | egrep "([1-9]).*1"

              #调用前面的第一个数字分组,过滤出一行中有两个相同数字的行

    efdgfd1fasdf1

    3fdavfdva3fggfdf

    33dfagqr23zdfbd

    [root@localhost ~]# cat d | egrep "^([1-9]).*1$"

               #调用前面的第一个数字分组,找出行首和行位相同数字的行

    1aefeeea2dfg1

     

    第二个规则:在单词锚定中和分组调用中,基础正则和扩展正则都必须加斜线

    |(扩展正则)

    匹配竖杠两边的任意一个

    过滤出cat 或者Cat

    # grep "cat|Cat" a.txt

    # grep "(C|c)at" a.txt

    3. 总结

    1> 正则表达式

      一、字符匹配

      .

      []

      [^]

      二、次数匹配

      *

      {m,n}

      三、锚定

      ^

      $

      <

      >

      四、分组

       ()

        1

    2> 扩展正则表达式

      grep -E

      egrep

      一、字符匹配

      .

      []

      [^]

      二、次数匹配

      *

      {m,n}

      + 表示其前面的字符出现最少一次的情况

      ?表示其前面的字符出现最多一次的情况

      三、锚定

      ^

      $

      <

      >

      四、分组

        ()

        1

        2

      五、或

      |

      正则表达式中的{}以及()都需要加上进行转义,而扩展正则表达式不需要

      |, ?,+是扩展正则独有的

      锚定单词首部和尾部在扩展正则以及正则中都需要加上

  • 相关阅读:
    MFC基于对话框的程序添加菜单
    iOS远程推送原理及实现过程
    基于SolrCloud的内容搜索和热点推送
    Android 常用抓包工具介绍之Charles
    帮你快速实现全景应用性能可视化
    Android常用抓包工具之TcpDump
    JAVA IO 序列化与设计模式
    《2015中国移动应用性能管理白皮书》欢迎来看
    利用听云Server和听云Network实测Kubernetes和Mesos在高并发下的网络性能
    魅族电商运维之路
  • 原文地址:https://www.cnblogs.com/ajunyu/p/10893403.html
Copyright © 2011-2022 走看看