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函数和正则表达式的主要内容,如果未能解决你的问题,请参考以下文章