shell脚本 4 函数与正则
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 工具举例说明。
注意:在匹配模式中一定要加上引号
符号 |
描述 |
实例 |
. |
匹配任意单个字符(必须存在) |
例子: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 |
+(扩展正则) |
表示其前面的字符出现最少一次的情况 |
匹配 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' |
[] |
表示范围内的一个字符 |
例子:过滤出包含小写字母的行 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个字符 |
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 "\<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 调用前面的第一个分组 |
例子:过滤出一行中有两个相同数字的行 # 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
一、字符匹配
.
[]
[^]
二、次数匹配
*
+ 表示其前面的字符出现最少一次的情况
?表示其前面的字符出现最多一次的情况
三、锚定
^
$
\<
\>
四、分组 ()
\1
\2
五、或 |
一.、正则表达式中的{}以及()都需要加上\进行转义,而扩展正则表达式不需要
二 、|, ?,+是扩展正则独有的
三、 锚定单词首部和尾部在扩展正则以及正则中都需要加上\
Posix字符 |
描述 |
[: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
- [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
补充:shell练习题
1. 每一秒钟输出/root下的文件至屏幕
2. 打印出包含某个关键词的文件(关键词执行脚本时接收)
3. 统计系统中以.sh结尾的文件总大小,输出结果以kb为单位
- 参考答案:
- 1.
- #!/bin/bash
- for file in `ls /root`
- do
- echo $file
- sleep 1
- done
- 2.
- #!/bin/bash
- key=$1
- for file in `find / -type f`
- do
- grep "$key" $file &>/dev/null
- if [ $? -eq 0 ];then
- echo $file
- sleep 1
- fi
- done
- 3.
- #!/bin/bash
- sum=0
- for size in `find /root -name "*.sh" -exec ls -l {} \; | cut -d " " -f 5`
- do
- let sum+=$size
- done
- echo "$((sum/1024))kb
shell脚本 4 函数与正则的更多相关文章
- Linux Shell脚本编程-函数
函数介绍 定义:把一段独立功能的的代码当做一个整体,并为之一个名字,命名的代码段,此即为函数: 功能:函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程. 注意: ...
- Shell脚本之八 函数
一.函数定义 Linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action; ...
- shell脚本的函数介绍和使用案例
#前言:今天我们来聊聊shell脚本中的函数知识,看一下函数的优势,执行过程和相关的使用案例,我们也来看一下shell和python的函数书写方式有什么不同 #简介 .函数也具有别名类似的功能 .函数 ...
- Shell脚本(五)函数
总结下shell中的函数用法 #!/bin/bash function add_v1() { echo "call function add" } function add_v2( ...
- Shell脚本学习 - 函数,输入输出重定向,文件
函数 函数定义 [ function ] funname [()] { action; [return int;] } 定义时可以是function fun(),也可以直接fun(),不带参数 返回值 ...
- shell脚本之函数的使用
把代码封装成函数,相当于造了一个“轮子”,之后就直接重复使用即可. 函数的创建 shell中函数的创建有2种方式 1.使用function关键字 语法 function test { ... } 2. ...
- shell脚本,awk结合正则来打印文件里面的内容。
文件内容如下:key1abc d key2 1.想得到如下结果: abc d 2.想得到如下结果: key1key2
- shell脚本中${...}函数的用法总结
${...}在字符串中有非常多的用法: 1.${var} 限定变量. 如果一个变量名A是另一个变量名AB的前部分,那么,如果要在AB相连时,要得到A的值,就必须使用${var}限定. 如果变量名不会产 ...
- 在shell脚本中使用函数
转载请标明:http://www.cnblogs.com/winifred-tang94/ 对于在脚本中重复使用的功能模块,可以封装成为函数. shell脚本中函数的定义可以使用如下两种方式: a. ...
随机推荐
- Python学习笔记_有关tuple的几点强调
创建只有一个元素的tuple,需要用逗号结尾消除歧义 a_tuple = (2,) tuple中的list mixed_tuple = (1, 2, ['a', 'b']) print("m ...
- Spring-02 第一个Spring程序
Spring-02 第一个Spring程序 第一个Spring程序 1.导入依赖 <dependency> <groupId>org.springframework</g ...
- springboot框架里的pom.xml文件里的m不显示,只有标红和<>符号的解决方法
这是因为没有把pom.xml文件加入到maven工程中,所以需要如图所示 亲测有效,原文链接:https://blog.csdn.net/qq_41026946/article/details/107 ...
- ElementUI使用总结
首先声明,我这总结的官网都有,只是将自己使用时遇到的问题,重新记录一下,官网地址:https://element.eleme.cn/ 1.表格内指定行数给定不同样式(类似于隔行变色,也能叫指定行数不同 ...
- BSOJ 1562 【堆练习】丑数3576
Description 丑数是指素因子都在集合{2,3,5,7}内的整数,第一个丑数是1. 现在输入n(n<=4000),输出第n个丑数. Input 输入文件仅一行为一个整数n. Output ...
- kubernetes cpu限制参数说明
docker CPU限制参数 Option Description --cpus=<value> Specify how much of the available CPU resourc ...
- 从零搭建一个IdentityServer——单页应用身份验证
上一篇文章我们介绍了Asp.net core中身份验证的相关内容,并通过下图描述了身份验证及授权的流程: 注:改流程图进行过修改,第三方用户名密码登陆后并不是直接获得code/id_token/acc ...
- 漏洞复现-CVE-2015-1427-Groovy远程代码执行
0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场) 0x01 影响版本 Elasticsearch 1.3.0-1.3. ...
- 「视频小课堂」ELK和Kafka是怎么就玩在一起成了日志采集解决方案文字版
视频地址:ELK和Kafka是怎么就玩在一起成了日志采集解决方案 视频文字版 今天呢我就带来了一期视频,主要就是讲ELK和Kafka之间的通讯关系通过对一张通讯图,和一些操作命令,让我们能更深入的去理 ...
- 键盘--扫描码--ASCII码--显示器上的字符
在上一篇,我讲了键盘操作会产生扫描码以及如何解析Pause键和Print Screen键的扫描码. 在这一篇,我会说清楚"键盘上的输入为什么会出现在显示器上". 极简版 我们敲击键 ...