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

  五、或

  |

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

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

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

原文地址:https://www.cnblogs.com/ajunyu/p/10893403.html

时间: 2024-11-01 19:21:06

Shell函数和正则表达式的相关文章

Shell 函数、数组与正则表达式

防伪码:白日依山尽,黄河入海流. 5.1  函数 格式: 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

【Linux系列】【基础版】第四章 Shell基础之正则表达式

4. Shell基础之正则表达式     4.1 正则就是一串有规律的字符串         4.1 grep              4.1.1 格式: grep [-cinrvABC] 'word' filename             4.1.2 -c //count,表示行数             4.1.3 -i //不区分大小写             4.1.4 -n  //显示行号             4.1.5 -r  //遍历所有子目录             4

linux Shell函数

Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 1 2 3 4 function 函数名() {     语句     [return] } 关键字function表示定义一个函数,可以省略,其后是函数名,有时函数名后可以跟一个括号,符号"{"表示函数执行命令的入口,该符号也可以在函数名那一行,"}"表示函数体的结

shell 函数定义及应用

1.函数介绍 函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程. 它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一部分. 使用时, 在shell 中  source  /path fo function_file,函数将保留至用户退出,也可以使用 unset function_name ,撤销函数 函数和shell程序比较相似,区别在于: Shell程序在子Shell中运行 而Shell函数在当前Shell中运

shell 函数

function 函数1.什么是函数函数也是具有和别名类似的功能:简单地说,函数的作用就是把程序里多次调用相同的代码部分定义成一份,然后为这一份代码起个名字,其他所有的重复调用这部分代码就都只调用这个名字就可以了,当需要修改这部分重复代码时,只需要改变函数体内的一份代码即可实现所有调用修改.使用函数的优势:1.把相同的程序段定义成函数,可以减少整个程序的代码量.2.增加程序的可读.易读性.3.可以实现程序功能模块化,不同的程序使用函数模块化.强调:对于shell来说,linux系统的2000个命

shell 函数 返回数组

shell 函数 返回数组,布布扣,bubuko.com

shell--9、Shell 函数

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] {     action;     [return int;] } 说明: 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数. 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. return后跟数值n(0-255 下面的例子定义了一个函数并进行调用:

shell 函数法实现监控web 网站url

使用shell 函数实现监控web 网站url [[email protected] scripts]# cat checkweb.sh #!/bin/bash function usage() {     echo $"usage:$0 url"     exit 1 } function check_url() {     wget --spider -q -o /dev/null --tries=1 -T 5 $1     if [ $? -eq 0 ]       then 

linux学习之shell脚本 ------- shell函数

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 今天来看一下Shell的函数. Shell函数 函数定义 shell允许将一组命令集或语句形成一个可用块,这些块称为Shell函数. 函数定义格式: 函数名(){ 命令1 -- } 或 function 函数名(){ -- } 函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中. 如下面的脚本就是一个只包含函数的单独文件. #!/bin/bash #fu