本节内容
1. shell 函数
2. shell 正则表达式
shell 函数
shell 中允许将一组命令集合或语句形成一段可用代码, 这些代码块称为 shell 函数. 给这段代码起个名字称为函数名, 后续可以直接调用该段代码.
格式
- func() {
- #指定函数名
- command #函数体
- }
实例 1:
- #!/bin/bash
- func() {
- echo "This is a function."
- }
- func
- # bash test.sh
- This is a function.
Shell 函数很简单, 函数名后跟双括号, 再跟双大括号. 通过函数名直接调用, 不加小括号.
示例 2: 函数返回值
- #!/bin/bash
- func() {
- VAR=$((1+1))
- return $VAR
- echo "This is a function."
- }
- 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 位置参数给函数传参.
shell 正则表达式
正则表达式在每种语言中都会有, 功能就是匹配符合你预期要求的字符串.
Shell 正则表达式分为两种:
基础正则表达式
扩展正则表达式: 扩展的表达式有 +,?,| 和()
正则表达式就是为了处理大量的文本 | 字符串而定义的一套规则和方法
通过定义的这些特殊符号的辅助, 系统管理员就可以快速过滤, 替换或输出需要的字符串. Linux 正则表达式一般以行为单位处理.
正则表达式和通配符有本质区别
不需要思考的判断方法: 在三剑客 awk,sed,grep,egrep 都是正则, 其他都是通配符
区别通配符和正则表达式最简单的方法:
(1)文件目录名 ===>通配符
(2)文件内容 (字符串, 文本[文件] 内容)===> 正则表达式
下面是一些常用的正则表达式符号, 我们先拿 grep 工具举例说明.
注意: 在匹配模式中一定要加上引号
符号 | 描述 & nbsp; | 实例 & nbsp; |
. | 匹配任意单个字符(必须存在) | 例子: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 在后的行 条件: 包含 & nbsp;a 和 & nbsp;b 字母 & nbsp;a 必须在 & nbsp;b 前面 # grep --color "a.*b" b.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' |
[] | 表示范围内的一个字符 | 例子:过滤出包含小写字母的行 & nbsp; grep [a-z] a.txt 例子:过滤出包含大写字母的行 & nbsp; grep [A-Z] a.txt 例子:过滤出包含数字的行 & nbsp; grep [0-9] a.txt 例子:过滤出包含数字和小写字母的行 & nbsp;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 个字符 | echo "aadadccc" | egrep "a{2}" echo "aadadccc" | egrep "a{1}" |
{n,m} | 匹配花括号前面字符至少 n 个字符,最多 m 个字符 | 例子: "ac\{2,5\}b" 匹配 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 "\ |
\> | 锚定单词尾部(单词一般以空格或特殊字符做分隔,) | # echo "hi,root,iamroot" | grep "\ |
() | \1 调用前面的第一个分组 | 例子:过滤出一行中有两个相同数字的行 # grep "\([0-9]\).*\1" inittab 例子:过滤出行首和行位字母相同的行 # grep "^\([a-z]\).*\1$" inittab |
|(扩展正则) | 匹配竖杠两边的任意一个 | 例子:过滤出 cat 或者 Cat # grep "cat|Cat" a.txt # grep "(C|c)at" a.txt |
总结
正则表达式
一, 字符匹配
.
[]
[^]
二, 次数匹配
*
\{m,n\}
三, 锚定
^
$
\<\>
四, 分组
\(\)
\1
扩展正则表达式
grep -E
egrep
一, 字符匹配
.
[]
[^]
二, 次数匹配
*
{m,n}
+ 表示其前面的字符出现最少一次的情况
? 表示其前面的字符出现最多一次的情况
三, 锚定
^
$
\<\>
四, 分组
()
\1
\2
五, 或
|
一., 正则表达式中的 {} 以及 () 都需要加上 \ 进行转义, 而扩展正则表达式不需要
二 ,|, ?,+ 是扩展正则独有的
三, 锚定单词首部和尾部在扩展正则以及正则中都需要加上 \
Posix 字符 & nbsp; | 描述 & nbsp; |
[:alnum:] |
等效 a-zA-Z0-9
|
[:alpha:] | 等效 a-zA-Z |
[:lower:] | 等效 a-z
|
[:upper:] | 等效 A-Z
|
[:digit:] | 等效 0-9 |
[:space:] | 匹配任意空白字符,等效 \ t\n\r\f\v
|
[:graph:] | 非空白字符
|
[:blank:] | 空格与定位字符
|
[:cntrl:] | 控制字符
|
[:print:] | 可显示的字符 |
[:punct:] | 标点符号字符
|
[:xdigit:] | 十六进制
|
注意: 使用这些字符的时候需要在外面还要加一个 [] 括号
说一下[: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"
正则练习
使用文件 /etc/init.d/functions , 下面可能有些部分题目匹配不到符合的情况.
1. 过滤出包含大写字母的行
2. 匹配非数字字符
3. 过滤出一行中 a 在前, b 在后的行
4. 匹配 a 和 b 之间有最少 2 个 c 最多 5 个 c 的行
5. 过滤出以# 为开头, 且第二个字符是空格的行
6. 过滤出行首和行位字母相同的行
7. 过滤出第一个字符是 #, 且第二个字符串是非空字符, 而且结尾是数字的行
8. 过滤出一行包含相同数字的行 / etc/init.d/functions
答案:
- 1.
- [root@ken ~]# grep "[A-Z]" /etc/init.d/functions
- 2.
- [root@ken ~]# grep "[^0-9]" /etc/init.d/functions
- 3.
- [root@ken ~]# grep "a.*b" /etc/init.d/functions
- 4.(匹配不到)
- [root@ken ~]# grep "ac\{2,5\}b" /etc/init.d/functions
- 5.
- [root@ken ~]# grep "^#[[:space:]]" /etc/init.d/functions
- 6.(匹配不到)
- [root@ken ~]# grep "^\([a-z]\).*\1$" /etc/init.d/functions
- 7.(匹配不到)
- [root@ken ~]# grep "^#[^[:space:]].*[0-9]$" /etc/init.d/functions
- 8.
- [root@ken ~]# egrep ".*([0-9]).*\1" /etc/init.d/functions
来源: https://www.cnblogs.com/kenken2018/p/10229140.html