1. shell函数

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

  格式:

    func() {   #指定函数名

    command    #函数体

    }

  

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

#显示文本颜色
[root@localhost ~]# vim test.sh
#!/bin/bash
fun (){
for i in {..}
do
echo -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 ""
return
echo ""
}
fun
[root@localhost ~]# bash test1.sh #return 在函数中定义状态返回值,返回并终止函数,但返回的只能是 0-255 的数字,类似于 exit。
[root@localhost ~]# vim test1.sh
#!/bin/bash
fun () {
echo ""
exit
}
fun
:wq
[root@localhost ~]# bash test1.sh [root@localhost ~]# echo $?
#函数传参
[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

  五、或

  |

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

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

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

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

  1. shell(shell函数、shell正则表达式)

    本章内容 shell函数 shell正则表达式 1.shell函数 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. 格式: funname () { CMD #函数体 ...

  2. shell脚本三——正则表达式

    shell函数:shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直接调用该段代码. 格式:fun() { 命令 } Shell ...

  3. Shell入门教程:Shell函数详解

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 ...

  4. Shell入门教程:Shell函数的返回值

    shell函数返回值一般有3种方式: 1.return语句(默认的返回值) shell函数的返回值可以和其他语言的返回值一样,通过return语句返回. 比如: #!/bin/bash functio ...

  5. (转)Shell函数

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.  函数 ...

  6. 任督二脉之Shell中的正则表达式

    VBird说学习Linux,掌握了Shell和正则就相当于打通了任督二脉,此后能力的成长才会突飞猛进. Shell的基础学习之前已经总结了一篇博客:http://www.cnblogs.com/jyz ...

  7. Linux Shell系列教程之(十五) Shell函数简介

    本文是Linux Shell系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell系列教程 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高 ...

  8. Shell函数的简单应用

    Shell函数的简单应用 在脚本内给函数传参: #!/bin/bash . /etc/init.d/functions CheckUrl (){ curl -I -s $ | head - } Che ...

  9. Shell函数语法

    Shell函数语法 定义函数: function   函数名(){ 指令... } 调用函数,方法1: 函数名 调用函数,方法2: 函数名  参数一   参数二 return在函数里面使用会跳出函数并 ...

随机推荐

  1. N的阶乘HDOJ1042

    我记得有一份代码是非常有技巧的,然而这一份就是很死板-每次跑50000,因为10000的阶乘最多才50000位,这样肯定就过了 #include<cstdio> #include<s ...

  2. LuoguP2700逐个击破【并查集/生成树/正难则反】By cellur925

    题目传送门 题目大意:给你一棵树,求把其中k个点相互隔离(不连通)所需要的边权代价. 这题我开始是想要求出把k个点联通的最小代价的,但后来发现还是实现起来比较困难,题解里貌似也没有这种做法,于是就鸽了 ...

  3. c++模板专门化

    #include <iostream> #include<cstring> using namespace std; template <typename T> T ...

  4. PTA天梯赛训练题L1-064:估值一亿的AI核心代码(字符串模拟)

    Update:smz说regex秒过Orz,yzd记在这里了. 听说今年天梯赛有个烦人的模拟,我便被队友逼着试做一下……一发15,二发20.记一记,要不然枉费我写这么久…… 自己还是代码能力太菜了,校 ...

  5. Throwing Dice LightOJ - 1064 || (勉强能用的)分数类

    Throwing Dice LightOJ - 1064 方法: 设ans[i][j]表示i个骰子点数恰好为j的概率.那么ans[1][1]到ans[1][6]都为1/6. 显然,$ans[i][j] ...

  6. Travelling HDU - 3001

    Travelling HDU - 3001 方法:3进制状态压缩dp(更好的方法是预处理出每个状态数字对应的y数组,然后用刷表,时间复杂度可以少一个n) #include<cstdio> ...

  7. 谷歌编码风格内容,新建一个xml文件,复制进去就可以在eclipse里面用了,命名--eclipse-java-google-style.xml

    <?xml version="1.0" encoding="UTF-8" standalone="no"?> <profi ...

  8. Windows API函数大全二

    4. API之打印函数 AbortDoc 取消一份文档的打印 AbortPrinter 删除与一台打印机关联在一起的缓冲文件 AddForm 为打印机的表单列表添加一个新表单 AddJob 用于获取一 ...

  9. 上交oj1219 重要的逆序数对

    题意: https://acm.sjtu.edu.cn/OnlineJudge/problem/1219 思路: 在经典的归并排序求逆序数对算法基础上稍作修改. 实现: #include <io ...

  10. 洛谷P2761 软件补丁问题(状压DP,SPFA)

    题意 描述不清... Sol 网络流24题里面怎么会有状压dp?? 真是狗血,不过还是简单吧. 直接用$f[sta]$表示当前状态为$sta$时的最小花费 转移的时候枚举一下哪一个补丁可以搞这个状态 ...