函数,正则

1.shell函数

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

格式

func() { #指定函数名

command #函数体

}

实例1:

#!/bin/bash

func() {

echo "This is a function."

}

func

# bash test.sh

This is a function.

示例 2:函数返回值

#!/bin/bash

func() {

VAR=$((1+1))

return $VAR

}

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 位置参数给函数传参。

2.shell正则表达式

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

Shell 正则表达式分为两种:

●基础正则表达式

●扩展正则表达式:扩展的表达式有+、?、| 和()

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

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

不需要思考的判断方法:在三剑客awk,sed,grep,egrep都是正则,其他都是通配符

区别通配符和正则表达式最简单的方法:(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

[]

表示范围内的一个字符

例子:过滤出包含小写字母的行 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}"

clip_image001

echo "aadadccc" | egrep "a{2,}"

clip_image002

{n,m}

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

匹配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 调用前面的第一个分组

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

# egrep "([0-9]).*1" inittab

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

# egrep "^([a-z]).*1$" inittab

|(扩展正则)

匹配竖杠两边的任意一个

例子:过滤出cat 或者Cat

# grep "cat|Cat" a.txt

# grep "(C|c)at" a.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'

3.总结

3.1 正则表达式

一、字符匹配

.

[]

[^]

二、次数匹配

*

{m,n}

三、锚定

^

$

<

>

四、分组

()

1

3.2 扩展正则表达式

grep -E

egrep

一、字符匹配

.

[]

[^]

二、次数匹配

*

{m,n}

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

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

三、锚定

^

$

<

>

四、分组

()

1

2

五、或

|

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

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

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

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

说一下[: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"

4.正则练习

原文地址:https://www.cnblogs.com/liangzb310/p/11026415.html