1. shell函数

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

  格式:

    func() {   #指定函数名

    command    #函数体

    }

  

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

#显示文本颜色
[root@localhost ~]# vim test.sh
#!/bin/bash
fun (){for i in {32..39}doecho -e "\033[${i}mHello World\033[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 2echo "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\nb\nc" | 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

  五、或

  |

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

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

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

转载于:https://www.cnblogs.com/ajunyu/p/10893403.html

Shell函数和正则表达式相关推荐

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

    防伪码:白日依山尽,黄河入海流. 5.1  函数 格式: func() { command } 示例 1: #!/bin/bash func() { echo "This is a func ...

  2. shell脚本实操学习之函数、正则表达式

    shell脚本实操学习之函数.正则表达式 shell函数 函数介绍 函数语法 函数应用 正则表达式 正则表达式介绍 特殊字符 POSIX字符 shell函数 函数介绍 在写代码的时候,我们很多人习惯从 ...

  3. day35-Shell函数与正则表达式

    课程目标 掌握case语句的基本语法结构 掌握函数的定义及调用 掌握常用的正则表达式元字符含义 一.case语句 case语句为多选择语句.可以用case语句匹配一个值与一个模式,如果匹配成功,执行相 ...

  4. pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字并生成新的数据列(extract numbers from column)

    pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字并生成新的数据列(extract numbers from column and generate n ...

  5. pandas使用replace函数和正则表达式移除dataframe字符串数据列中头部指定模式字符串(Removing leading substring in dataframe)

    pandas使用replace函数和正则表达式移除dataframe字符串数据列中头部指定模式字符串(Removing leading substring in dataframe) 目录

  6. pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字(设置expand=false之后返回的为series)、将series转化为dataframe

    pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字(设置expand=false之后返回的为series).把pandas series转化为panda ...

  7. pandas使用replace函数和正则表达式移除dataframe字符串数据列中尾部指定模式字符串(Removing trailing substring in dataframe)

    pandas使用replace函数和正则表达式移除dataframe字符串数据列中尾部指定模式字符串(Removing trailing substring in dataframe) 目录

  8. pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换

    pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换 目录

  9. linux使用shell函数扩充命令,Linux Shell系列教程之(十五) Shell函数简介 | Linux大学...

    摘要 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高. 高级语言都支持函数,Shell也不例外.今天就为大家介绍下Shell中函数相关用法. 函数可以将一个复杂功能划 ...

  10. shell 死循环if判断_运维小技巧(2):shell函数

    shell函数是什么 shell函数可以看作是一组shell命令的组合,用来完成一个特定的功能,它的功能和java中的方法类似. 2. shell函数长什么样 铛铛铛,先上代码. function l ...

最新文章

  1. ICCV 2019 | 无需数据集的Student Networks
  2. 【Android 组件化】路由组件 ( 使用 JavaPoet 生成路由表类 )
  3. visual studio如何更改启动项目?
  4. python的argsort函数_python——argsort函数
  5. 想学好数学,请收好这份宝典!
  6. openCVPracticalExercise学习笔记04
  7. 程序员的自我修养 pdf_软件特攻队|C/C++程序员的自我修养(5)
  8. 实验一 Linux开发环境的配置 20145213祁玮 20145222黄亚奇
  9. 三维点云学习(3)7- 实现GMM
  10. CGPathAddArc
  11. WinCE驱动之Touch Panel(开发详解)
  12. Visual Studio 2017 下创建ASP.NET网站程序详细步骤
  13. python编写poc_Poc编写
  14. vue项目的IE兼容问题
  15. home credit default risk捷信消费金融违约风险模型复现(论文_毕业设计_作业)
  16. macbook pro window蓝牙驱动 下载
  17. 北航计算机学院吉祥物,北航软件学院吉祥物征集令
  18. VMware 日记一:基础的系统安装和基本配置解析
  19. Python 进阶视频课 - 10. LSMC 美式百慕大期权定价
  20. html 签到功能,从一个签到功能(日历)到 js Date 类型的全了解

热门文章

  1. 内网客户用outlook2010连接Exchange2010
  2. Google 产品速查手册大全
  3. 初识delphi-spring-framework
  4. Xzwcad(中望CAD注册机-适用于全系列标准版、专业版、中望结构)
  5. hdu 1255 覆盖的面积 线段树扫描线求重叠面积
  6. inDesign教程,如何创建交互式简历?
  7. Gigapixel AI 6.0 for Mac(图片无损放大软件)
  8. 如何使用Airdrop将视频从Mac发送到iPhone?
  9. 如何高级地对抗恶意程序的糖衣炮弹?
  10. WPF中查找指定类型的父控件