Shell函数和正则表达式

Posted ajunyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell函数和正则表达式相关的知识,希望对你有一定的参考价值。

1. shell函数

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

  格式:

    func() {   #指定函数名

    command    #函数体

    }

  

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

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


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

[[email protected] ~]# cat zhengze

like

love

lect

[[email protected] ~]# cat zhengze | grep "l..e"

like

love

^

匹配前面字符串开头

匹配abc开头的行

[[email protected] ~]# cat zhngze

abc you love me

i love you abc

[[email protected] ~]# cat zhngze | grep "^abc"

abc you love me

$

匹配前面字符串结尾

匹配abc结尾的行

[[email protected] ~]# cat zhngze

abc you love me

i love you abc

[[email protected] ~]# cat zhngze | grep "abc$"

i love you abc

 

 

过滤掉空行

[[email protected] ~]# cat a

123fsasf12

                                #空行

fasfdsadfsa

adasfa12

123ddfs

167dsaf

daf

[[email protected] ~]# cat a | grep -v "^$"#去空行

123fsasf12

fasfdsadfsa

adasfa12

123ddfs

167dsaf

daf

*

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

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

[[email protected] ~]# cat t | grep "a*"

abcaa

bcacd

aaabc

cbda

zxcv

[[email protected] ~]# cat t | grep -o "a*"

a

aa

a

aaa

a

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

[[email protected] ~]# cat t | grep  "a*b"

abcaa

bcacd

aaabc

cbda

[[email protected] ~]# cat t | grep -o  "a*b"

ab

b

aaab

b

 

.* 

表示任意长度的任意字符

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

条件:

包含 a 和 b

字母 a 必须在 b前面

[[email protected] ~]# cat t

abcaa

bcacd

aaabc

cbda

zxcv

[[email protected] ~]# cat t | grep "a.*b"

abcaa

aaabc

+(扩展正则)

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

[[email protected] ~]# cat t

abcaacdfabvfab

bcacd

aaabc

cbda

zxcv

[[email protected] ~]# cat t | grep -E "ab+"

abcaacdfabvfab

aaabc

[[email protected] ~]# cat t | egrep "ab+"

abcaacdfabvfab

aaabc

[[email protected] ~]# cat t | grep "ab+"  #要正则

[[email protected] ~]#

?

(扩展正则)

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

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

[[email protected] ~]# cat t

abcaacdfabvfab

bcacd

aaabc

cbda

zxcv

[[email protected] ~]# cat t | grep "a?c"

[[email protected] ~]# cat t | egrep "a?c"

abcaacdfabvfab

bcacd

aaabc

cbda

zxcv

[ ]

表示范围内的一个字符

[[email protected] ~]# cat a

123fsasf12

 

fasfdsadfsa

adasfa12

123ddfs

167dsaf

daf

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

[[email protected] ~]# cat a | grep "^[a-z]"

fasfdsadfsa

adasfa12

daf

[ .-.]

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

匹配所有字母

echo -e "a\nb\nc" | grep ‘[a-z]‘

 

[^]

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

[[email protected] ~]# cat a

123fsasf12

 

fasfdsadfsa

adasfa12

123ddfs

167dsaf

daf

[[email protected] ~]# cat a | grep "^[^a-z]"

#不以字母开头的文件

123fsasf12

123ddfs

167dsaf

{n}或者{n,}

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

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

 

[[email protected] ~]# cat b

bbbasdfhhf

bb1235sdf

babababba

agdsaf

asdf

[[email protected] ~]# cat b | grep "b\{2\}"

bbbasdfhhf

bb1235sdf

babababba

[[email protected] ~]# cat b | grep "b\{3,\}"

#至少3个

bbbasdfhhf

[[email protected] ~]# cat b | egrep "b{3,}"

bbbasdfhhf 

 

 

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

{n,m}

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

[[email protected] ~]# cat b | egrep "b{2,3}a"

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

bbbasdfhhf

babababba

[[email protected] ~]# cat b | egrep "fh{2,}f"

#f和f之间最少2个h

bbbasdfhhf

[[email protected] ~]# cat b | egrep "as{,1}f"

#a到f之间最多1个s

agdsaf

\<

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

[[email protected] ~]# cat c

df:ceroot:fasdf:rootvdga

agd dsaf rootadg dagaggd

sfafa afdarootadf agdag

[[email protected] ~]# cat c | grep "\<root"

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

df:ceroot:fasdf:rootvdga

agd dsaf rootadg dagaggd

\>

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

[[email protected] ~]# cat c | grep "root\>"

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

df:ceroot:fasdf:rootvdga

( )

\1  调用前面的第一个分组

[[email protected] ~]# cat d

efdgfd1fasdf1

1aefeeea2dfg

3fdavfdva3fggfdf

33dfagqr23zdfbd

abffsh23sfg

[[email protected] ~]# cat d | egrep "([1-9]).*\1"

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

efdgfd1fasdf1

3fdavfdva3fggfdf

33dfagqr23zdfbd

[[email protected] ~]# 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

 

  五、或

  |

 

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

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

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

以上是关于Shell函数和正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

shell函数与正则

shell编程

Shell 函数数组与正则表达式

通过 Java 正则表达式提取 semver 版本字符串的片段

模拟Linux的shell

shell编程之正则表达式基础正则表达式