函数,正则
Posted liangzb310
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数,正则相关的知识,希望对你有一定的参考价值。
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 正则表达式分为两种:
●基础正则表达式
●扩展正则表达式:扩展的表达式有+、?、| 和()
- 正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法
- 通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。Linux正则表达式一般以行为单位处理。
2.1 正则表达式和通配符有本质区别
不需要思考的判断方法:在三剑客awk,sed,grep,egrep都是正则,其他都是通配符
区别通配符和正则表达式最简单的方法:(1)文件目录名===>通配符
(2)文件内容(字符串,文本【文件】内容)===>正则表达式
下面是一些常用的正则表达式符号,我们先拿 grep 工具举例说明。
注意:在匹配模式中一定要加上引号
符号
描述
实例
.
匹配任意单个字符(必须存在)一个.一个字符。
例子:l..e
可以表示
love
like
leee
不可以表示的
labcde
le
Lee
^
匹配前面字符串开头
匹配以 abc 开头的行:
echo -e "abc\\nxyz" |grep ^abc
$
匹配前面字符串结尾
匹配以 xyz 结尾的行:
echo -e "abc\\nxyz" |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\\nb\\nc" |grep ‘[a-z]‘
[^]
匹配[^字符]之外的任意一个字符
匹配 a 或 b:
echo -e "a\\nb\\nc" |grep ‘[^c-z]‘
匹配末尾数字:echo "abc:cde;123" |grep -E
‘[^;]+$‘
^[^]
匹配不是中括号内任意一个字符开头的行
匹配不是#开头的行:
grep ‘^[^#]‘ /etc/httpd/conf/httpd.conf
n或者n,
n:表示严格匹配n个字符
n,匹配花括号前面字符至少 n个字符
echo "aadadccc" | egrep "a2"
echo "aadadccc" | egrep "a2,"
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\\nabcc\\nadd" |grep -E ‘ab+‘
匹配单个数字:echo "113" |grep -o ‘[0-9]‘
连续匹配多个数字:echo "113" |grep -E -o ‘[0-9]+‘
?(扩展正则)
表示其前面的字符出现最多一次的情况(可以0个)
匹配 ac 或 abc:
echo -e "ac\\nabc\\nadd" |grep -E ‘a?c‘
3.总结
3.1 正则表达式
一、字符匹配
.
[]
[^]
二、次数匹配
*
\\m,n\\
三、锚定
^
$
\\<
\\>
四、分组
\\(\\)
\\1
3.2 扩展正则表达式
grep -E
egrep
一、字符匹配
.
[]
[^]
二、次数匹配
*
m,n
+ 表示其前面的字符出现最少一次的情况
?表示其前面的字符出现最多一次的情况
三、锚定
^
$
\\<
\\>
四、分组
()
\\1
\\2
五、或
|
一.、正则表达式中的以及()都需要加上\\进行转义,而扩展正则表达式不需要
二 、|, ?,+是扩展正则独有的
三、锚定单词首部和尾部在扩展正则以及正则中都需要加上\\
注意:使用这些字符的时候需要在外面还要加一个[]括号
说一下[:space:]
[[email protected] ~]# cat test #文本内容
#!/bin/bash
if [ 1 -eq 1 ];
then echo "yes"
else echo "no"
fi
AJDLAJDL
LAJLDJA
JDKAJkjskdjklaskj
lsdjal0dlkakm
[[email protected] ~]# grep ‘[[:space:]]‘ test #过滤出包含空格的行,[:space:]括号外面还要再包含一个[]
if [ 1 -eq 1 ];
then echo "yes"
else echo "no"
[[email protected] ~]# grep ‘ ‘ test #也可以使用一个空格来代替[:space:]
if [ 1 -eq 1 ];
then echo "yes"
else echo "no"
4.正则练习
以上是关于函数,正则的主要内容,如果未能解决你的问题,请参考以下文章