Shell编程(week4_day4)--技术流ken
本节内容
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=$((+))
return $VAR
echo "This is a function."
}
func
echo $? # bash test.sh
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}:表示严格匹配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" |
\> |
锚定单词尾部(单词一般以空格或特殊字符做分隔,) |
# echo "hi,root,iamroot" | grep "\<root" |
() |
\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字符 |
描述 |
[: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 [ -eq ];
then echo "yes"
else echo "no"
fi
AJDLAJDL
LAJLDJA
JDKAJkjskdjklaskj
lsdjal0dlkakm [root@ken ~]# grep '[[:space:]]' test #过滤出包含空格的行,[:space:]括号外面还要再包含一个[]
if [ -eq ];
then echo "yes"
else echo "no" [root@ken ~]# grep ' ' test #也可以使用一个空格来代替[:space:]
if [ -eq ];
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
done
2.
#!/bin/bash
key=$
for file in `find / -type f`
do
grep "$key" $file &>/dev/null
if [ $? -eq ];then
echo $file
sleep
fi
done
3.
#!/bin/bash
sum=
for size in `find /root -name "*.sh" -exec ls -l {} \; | cut -d " " -f `
do
let sum+=$size
done
echo "$((sum/1024))kb"
Shell编程(week4_day4)--技术流ken的更多相关文章
- Shell编程(week4_day1)--技术流ken
本节内容 1.shell简介 2. shell分类 3. 查看shell 4. 第一个shell脚本 5. shell编程常用命令 5.1 grep 5.2 cut 5.3 sort ...
- Shell编程(week4_day3)--技术流ken
本节内容 1. shell流程控制 2. for语句 3. while语句 4. break和continue语句 5. case语句 6. shell编程高级实战 shell流程控制 流程控制是改变 ...
- Shell编程(week4_day2)--技术流ken
本节内容 1. shell变量简介 2. 定义变量 3. 使用变量 4. 修改变量的值 5. 单引号和双引号的区别 6. 将命令的结果赋值给变量 7. 删除变量 8. 变量类型 9. 特殊变量列表 1 ...
- Shell编程(week4_day5)--技术流ken
本节内容 1. 三剑客简介 2. sed命令详解 3. awk命令详解 文本处理三剑客 在 Shell 下使用这些正则表达式处理文本最多的命令有下面几个工具: 命令 描述 ...
- zabbix实现百台服务器的自动化监控--技术流ken
前言 最近有小伙伴通过Q联系到我说:公司现在有百多台服务器,想要部署zabbix进行监控,怎么实现自动化全网监控? 本篇博客将讲解一个我工作时做的一个实际项目,现在写出来供大家以后参考使用. 实现自动 ...
- Docker之使用Dockerfile创建定制化镜像(四)--技术流ken
前言 在之前的博客<Docker端口映射及创建镜像演示(二)--技术流ken>,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载. 但是这样的镜像有很大的局限性,不能根 ...
- Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署动态网站(二)--技术流ken
项目前言 在上一篇博客<Jenkins+Git+Gitlab+Ansible实现持续化集成一键部署静态网站(一)--技术流ken>中已经详细讲解了如何使用这四个工具来持续集成自动化部署一个 ...
- Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署静态网站(一)--技术流ken
前言 在之前已经写了关于Git,Gitlab以及Ansible的两篇博客<Git+Gitlab+Ansible剧本实现一键部署Nginx--技术流ken>,<Git+Gitlab+A ...
- Jenkins凭证及任务演示-pipeline(二)--技术流ken
Jenkins前言 在上一篇博客<Jenkins持续集成介绍及插件安装版本更新演示(一)--技术流ken>中已经详细介绍了jenkins的插件安装以版本更新等,本篇博客将再深入探究jenk ...
随机推荐
- [NOIP2014]飞扬的小鸟 D1 T3 loj2500 洛谷P1941
分析: 这是一个DP,没什么好说的,细节很烦人. DP[i][j]表示到第i个位置,高度为j点最少的次数. 转移: 当j=m时 k属于[m-h,m]都可以向DP[i][j]转移,即dp[i][j]=m ...
- LSTM实现中文文本情感分析
1. 背景介绍 文本情感分析是在文本分析领域的典型任务,实用价值很高.本模型是第一个上手实现的深度学习模型,目的是对深度学习做一个初步的了解,并入门深度学习在文本分析领域的应用.在进行模型的上手实现之 ...
- Bootstrap优秀模板-INSPINIA.2.9.2
下载量最高的Bootstrap管理端模板,完美适配H5,.NET COre.MVC5.Ruby on Rails多种开发环境. 下面是官方介绍:INSPINIA Admin Theme is a pr ...
- Spark学习之RDD编程总结
Spark 对数据的核心抽象——弹性分布式数据集(Resilient Distributed Dataset,简称 RDD).RDD 其实就是分布式的元素集合.在 Spark 中,对数据的所有操作不外 ...
- Java的多态浅谈
概述 Java的四大基本特性:抽象,封装,继承和多态.其中,抽象,封装,继承可以说多态的基础,而多态是封装,继承的具体表现.如果非要用专业术语来描述什么是多态的话 多态是指程序中定义的引用变量所指向具 ...
- SpringBoot从零单排 ------初级入门篇
有人说SSM已死,未来是SpringBoot和SpringCloud的天下,这个观点可能有点极端,但不可否认的是已经越来越多的公司开始使用SpringBoot.所以我将平时学习SpringBoot的内 ...
- 程序猿必知必会Linux命令之awk
前言 对于一名专业的程序员来说,Linux相关知识是必须要掌握的,其中对于文本的处理更是我们常见的操作,比如格式化输出我们需要的数据,这些数据可能会来源于文本文件或管道符,或者统计文本里面我们需要的数 ...
- Scala的类层级讲解
Scala的类层级 Scala里,每个类都继承自通用的名为Any的超类. 因为所有的类都是Any的子类,所以定义在Any中的方法就是"共同的"方法:它们可以被任何对象调用. Sca ...
- 新更新kb4493472导致无法正常开机
昨天陆续接到电话,说是系统更新后电脑不能正常使用,症状基本是开机到欢迎界面就出现各种各样的状况,比如鼠标能动,其他无反应;欢迎界面结束后黑屏,只有鼠标能动:开机后正常,但电脑使用很卡等等状况.因为昨天 ...
- 使用Swiper轮播插件引起的探索
提到Swiper轮播插件,小伙伴们应该不会感到陌生.以前我主要在移动端上使用,PC端使用较少. 注:这里需要注意的是,在PC端和移动端使用Swiper是不同的 官方给的版本有三个,分别是Swiper2 ...