zoukankan      html  css  js  c++  java
  • shell学习3.shell函数,正则表达式

    shell函数

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

    格式

    func() {   #指定函数名
    
    command    #函数体
    
    }

    实例1:

    #!/bin/bash
    func() {
    echo "This is a function."
    }
    func
    
    # bash test.sh
    This is a function.

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

    示例 2:函数返回值

    #!/bin/bash
    func() {
    VAR=$((1+1))
    return $VAR
    echo "This is a function."
    }
    func
    echo $?
    
    # bash test.sh
    2

    return 在函数中定义状态返回值,返回并终止函数,但返回的只能是 0-255 的数字,类似于 exit。

    示例 3:函数传参

    #!/bin/bash
    func() {
    echo "Hello $1"
    }
    func world
    # bash test.sh
    Hello world

    通过 Shell 位置参数给函数传参。

    shell正则表达式

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

    Shell 正则表达式分为两种:

    •  基础正则表达式
    • 扩展正则表达式:扩展的表达式有+、?、| 和()
    1. 正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法
    2. 通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。Linux正则表达式一般以行为单位处理。

    正则表达式和通配符有本质区别

    1. 不需要思考的判断方法:在三剑客awk,sed,grep,egrep都是正则,其他都是通配符
    2. 区别通配符和正则表达式最简单的方法:

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

    下面是一些常用的正则表达式符号,我们先拿 grep 工具举例说明。

    注意:在匹配模式中一定要加上引号

                      符号                         描述                                实例
    . 匹配任意单个字符(必须存在) 例子:l..e

    可以表示

    love

    like

    leee

    不可以表示的

    labcde

    le

    lee

    ^ 匹配前面字符串开头 匹配以 abc 开头的行:

    echo -e “abc xyz” |grep ^abc

    $ 匹配前面字符串结尾 匹配以 xyz 结尾的行:

    echo -e “abc xyz” |grep xyz$

    * 匹配前一个字符的零个或多个 a*  表示出现任意个a的情况

    a*b 表示b前面有任意个a的情况(包括没有a的情况)

    .* 
    表示任意长度的任意字符 例子:过滤出一行中a在前,b在后的行

    条件:

    包含 a 和 b

    字母 a 必须在 b前面

    # grep –color “a.*b” b.txt

    +(扩展正则) 表示其前面的字符出现最少一次的情况 匹配 abc 和 abcc:

    echo -e “abc abcc add” |grep -E ‘ab+’

    匹配单个数字:echo “113” |grep -o ‘[0-9]’

    连续匹配多个数字:echo “113” |grep -E -o ‘[0-9]+’

    ?(扩展正则) 表示其前面的字符出现最多一次的情况(可以0个) 匹配 ac 或 abc:

    echo -e “ac abc add” |grep -E ‘a?c’

    [] 表示范围内的一个字符 例子:过滤出包含小写字母的行       grep [a-z] a.txt

    例子:过滤出包含大写字母的行       grep [A-Z] a.txt

    例子:过滤出包含数字的行           grep [0-9] a.txt

    例子:过滤出包含数字和小写字母的行 grep [0-9a-z] a.txt

    例子:过滤出包含字母asf的行        grep [asf] a.txt

    [ .-.] 匹配中括号中范围内的任意一个字符 匹配所有字母

    echo -e “a b c” |grep ‘[a-z]’

    [^] 匹配[^字符]之外的任意一个字符 匹配 a 或 b:

    echo -e “a b c” |grep ‘[^c-z]’

    匹配末尾数字:echo “abc:cde;123” |grep -E

    ‘[^;]+$’

    ^[^] 匹配不是中括号内任意一个字符开头的行 匹配不是#开头的行:

    grep ‘^[^#]’ /etc/httpd/conf/httpd.conf

    {n}或者{n,} {n}:表示严格匹配n个字符

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

    echo “aadadccc” | egrep “a{2}”

    echo “aadadccc” | egrep “a{1}”

    {n,m} 匹配花括号前面字符至少 n个字符,最多 m 个字符 例子:

    “ac{2,5}b” 匹配a和b之间有最少2个c最多5个c的行

    “ac{,5}b” 匹配a和b之间有最多5个c的行

    “ac{2,}b” 匹配a和b之间有最少2个c的行

    <  锚定单词首部(单词一般以空格或特殊字符做分隔) # echo “hi,root,iamroot” | grep “<root”
    hi,root,iamroot
    # echo “hi,root,iamroot” | grep “root>”
    hi,root,iamroot
    # echo “hi,root,iamroot” | grep “<root>”
    hi,root,iamroot
    >  锚定单词尾部(单词一般以空格或特殊字符做分隔,) # echo “hi,root,iamroot” | grep “<root”
    hi,root,iamroot
    # echo “hi,root,iamroot” | grep “root>”
    hi,root,iamroot
    # echo “hi,root,iamroot” | grep “<root>”
    hi,root,iamroot
    () 1  调用前面的第一个分组  

    例子:过滤出一行中有两个相同数字的行

    # grep “([0-9]).*1” inittab

    例子:过滤出行首和行位字母相同的行

    # grep “^([a-z]).*1$” inittab

    |(扩展正则) 匹配竖杠两边的任意一个  

    例子:过滤出cat 或者Cat

    # grep “cat|Cat” a.txt

    # grep “(C|c)at” a.txt

    总结

    正则表达式

    一、字符匹配

    .

    []

    [^]

    二、次数匹配

    *

    {m,n}

    三、锚定

    ^

    $

    <

    >

    四、分组

    ()

    1

    扩展正则表达式

    grep -E

    egrep

    一、字符匹配

    .

    []

    [^]

    二、次数匹配

    *

    {m,n}

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

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

    三、锚定

    ^

    $

    <

    >

    四、分组

    ()

    1

    2

    五、或

    |

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

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

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

                                      Posix字符                                          描述
    [:alnum:]  

    等效a-zA-Z0-9

    [:alpha:] 等效a-zA-Z
    [:lower:] 等效a-z
    [:upper:] 等效A-Z
    [:digit:] 等效0-9
    [:space:] 匹配任意空白字符,等效 fv
    [:graph:] 非空白字符
    [:blank:] 空格与定位字符
    [:cntrl:] 控制字符
    [:print:] 可显示的字符
    [:punct:] 标点符号字符
    [:xdigit:] 十六进制

    注意:使用这些字符的时候需要在外面还要加一个[]括号

    说一下[:space:]

    [root@ken ~]# cat test    #文本内容
    #!/bin/bash
    if [ 1 -eq 1 ];
    then    echo "yes"
    else    echo "no"
    fi
    AJDLAJDL
    LAJLDJA
    JDKAJkjskdjklaskj
    lsdjal0dlkakm
    
    [root@ken ~]# grep '[[:space:]]' test   #过滤出包含空格的行,[:space:]括号外面还要再包含一个[]
    if [ 1 -eq 1 ];
    then    echo "yes"
    else    echo "no"

    [root@ken ~]# grep ' ' test #也可以使用一个空格来代替[:space:] if [ 1 -eq 1 ]; then echo "yes" else echo "no"

    shell正则表达式练习

    1。   一个点.     表示含义匹配单个字符且该字符必须存在(相当与通配符中的问号)

    例子1:

    [root@ken ~]# cat test
    ac
    abc
    abbc
    anmcc

    [root@ken ~]# grep “a.c” test
    abc

    [root@ken ~]# grep -o “a..c” test
    abbc
    anmc

    2. ^ 表示匹配以某个字符开头的行

    例子1:匹配以root开头的行

    [root@ken ~]# cat test1
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    [root@ken ~]# grep “^root” test1
    root:x:0:0:root:/root:/bin/bash
    [root@ken ~]# grep “^r” test1
    root:x:0:0:root:/root:/bin/bash

    例子2:找到所有#号开头的行

    [root@ken ~]# grep “^#” test1
    #shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    #halt:x:7:0:halt:/sbin:/sbin/halt

    3. $ 表示匹配以什么字符结尾的行

    例子1:找到所有以bash结尾的行

    [root@ken ~]# grep “bash$” test1
    root:x:0:0:root:/root:/bin/bash

    例子2:找到所有空白行

    [root@ken ~]# vim test1
    [root@ken ~]# grep “^$” test1

    4. * 表示的是匹配前面的一个字符出现0次或者多次

    例子1:

    [root@ken ~]# cat test | grep -o “a*b”
    ab
    ab
    b
    aab
    aaab
    aaaaab
    b

    例子2:

    [root@ken ~]# cat test
    abc
    abbc
    aab
    aaab
    aaaaab
    acab

    [root@ken ~]# cat test | grep -o “a*b”
    ab
    ab
    b
    aab
    aaab
    aaaaab
    ab

    例子3:

    [root@ken ~]# cat test
    abc
    abbc
    aab
    aaab
    aaaaab
    acab

    [root@ken ~]# grep -o “a.*b” test
    ab
    abb
    aab
    aaab
    aaaaab
    acab

    5. []  表示匹配括号内的一个字符

    例子1:

    [root@ken ~]# cat test | grep -o “[ab]”
    a
    b
    a
    b
    b
    a
    a
    b
    a
    a
    a
    b
    a
    a

    例子2:匹配以字母开头的行

    [root@ken ~]# cat test1 | grep “^[a-z]”
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    operator:x:11:0:operator:/root:/sbin/nologin

    例子3:

    [root@ken ~]# cat test1 | grep “^[a-zA-Z]”
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    Sync:x:5:0:sync:/sbin:/bin/sync
    Ooperator:x:11:0:operator:/root:/sbin/nologin

    例子4:

    [root@ken ~]# cat test1 | grep “^[a-zA-Z0-9]”
    root:x:0:0:root:/root:/bin/bash
    3bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    Sync:x:5:0:sync:/sbin:/bin/sync
    Ooperator:x:11:0:operator:/root:/sbin/nologin

    6. ^[^] 表示匹配非括号内的行

    例子1:

    [root@ken ~]# cat test1 | grep “^[^a-z]”
    3bin:x:1:1:bin:/bin:/sbin/nologin
    Sync:x:5:0:sync:/sbin:/bin/sync
    #shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    #halt:x:7:0:halt:/sbin:/sbin/halt
    $mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    Ooperator:x:11:0:operator:/root:/sbin/nologin

    7.锚定 单词首部:<     特殊字符,空格

    锚定单词尾部: >

    例子1:

    [root@ken ~]# cat test1 | grep “<root”
    root:x:0:0:root:/root:/bin/bash
    Ooperootrator:x:11:0:operator:/root:/sbin/nologin

    例子2:

    [root@ken ~]# cat test1 | grep “<root>”
    root:x:0:0:root:/root:/bin/bash
    rootooperootrator:x:11:0:operator:/root:/sbin/nologin

    基础正则:中的{}。以及()前面都要加上

    使用格式:{}   ()

    8. {m,n}  表示匹配前面的字符出现至少m次,至多n次

    例子1:

    [root@ken ~]# cat test | grep -o “a{1,2}b”
    ab
    ab
    aab
    aab
    aab
    ab

    例子2:

    [root@ken ~]# cat test | grep -o “a{1,}b”
    ab
    ab
    aab
    aaab
    aaaaab
    ab

    9. ()   1表示的对某个单词进行分组,1表示对第一个分组进行调用

    [root@ken ~]# sed -i ‘s/(SELINUX=)disabled/1enforcing/g’ /etc/sysconfig/selinux

    扩展正则使用:

    1.egrep

    2.grep -E

    10.+  表示前面的字符出现一次的情况

    例子1:

    [root@ken ~]# cat test | egrep “a+b”
    abc
    abbc
    aab
    aaab
    aaaaab
    acab

    例子2:

    [root@ken ~]# cat test | grep -E “a+b”
    abc
    abbc
    aab
    aaab
    aaaaab
    acab

    11.| 或

    例子1:

    [root@ken ~]# echo “cat jdkajk Cat” | grep -E “(cat)|(Cat)”
    cat jdkajk Cat

    例子2:

    [root@ken ~]# echo “cat jdkajk Cat” | grep -E “(c|C)at”

    cat jdkajk Cat

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

    例子1:

    [root@ken ~]# cat test | grep -E -o “a?b”
    b
    ab
    ab
    b
    ab
    ab
    ab
    ab

  • 相关阅读:
    BSF、BSR: 位扫描指令
    驱动学习4
    DDK Build的DIRS和SOURCE文件
    sql语句中的字符串拼接
    delphi中WMI的使用(二)
    delphi中WMI的使用(一)
    WPF中实现砖块拖动的方法(2)
    HttpWebRequest中UserAgent的使用
    获取本机外网IP相关
    WPF中实现砖块拖动的方法(1)
  • 原文地址:https://www.cnblogs.com/1011cjk/p/11002370.html
Copyright © 2011-2022 走看看