本节内容

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 正则表达式分为两种:

  • 基础正则表达式
  • 扩展正则表达式:扩展的表达式有+、?、| 和()
  1. 正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法
  2. 通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。Linux正则表达式一般以行为单位处理。

正则表达式和通配符有本质区别

  1. 不需要思考的判断方法:在三剑客awk,sed,grep,egrep都是正则,其他都是通配符
  2. 区别通配符和正则表达式最简单的方法:

    (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"
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

一、字符匹配

.

[]

[^]

二、次数匹配

*

{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的更多相关文章

  1. Shell编程(week4_day1)--技术流ken

    本节内容 1.shell简介 2. shell分类 3. 查看shell 4. 第一个shell脚本 5. shell编程常用命令   5.1 grep   5.2 cut   5.3 sort   ...

  2. Shell编程(week4_day3)--技术流ken

    本节内容 1. shell流程控制 2. for语句 3. while语句 4. break和continue语句 5. case语句 6. shell编程高级实战 shell流程控制 流程控制是改变 ...

  3. Shell编程(week4_day2)--技术流ken

    本节内容 1. shell变量简介 2. 定义变量 3. 使用变量 4. 修改变量的值 5. 单引号和双引号的区别 6. 将命令的结果赋值给变量 7. 删除变量 8. 变量类型 9. 特殊变量列表 1 ...

  4. Shell编程(week4_day5)--技术流ken

    本节内容 1. 三剑客简介 2. sed命令详解 3. awk命令详解 文本处理三剑客 在 Shell 下使用这些正则表达式处理文本最多的命令有下面几个工具: 命令                描述 ...

  5. zabbix实现百台服务器的自动化监控--技术流ken

    前言 最近有小伙伴通过Q联系到我说:公司现在有百多台服务器,想要部署zabbix进行监控,怎么实现自动化全网监控? 本篇博客将讲解一个我工作时做的一个实际项目,现在写出来供大家以后参考使用. 实现自动 ...

  6. Docker之使用Dockerfile创建定制化镜像(四)--技术流ken

    前言 在之前的博客<Docker端口映射及创建镜像演示(二)--技术流ken>,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载. 但是这样的镜像有很大的局限性,不能根 ...

  7. Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署动态网站(二)--技术流ken

    项目前言 在上一篇博客<Jenkins+Git+Gitlab+Ansible实现持续化集成一键部署静态网站(一)--技术流ken>中已经详细讲解了如何使用这四个工具来持续集成自动化部署一个 ...

  8. Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署静态网站(一)--技术流ken

    前言 在之前已经写了关于Git,Gitlab以及Ansible的两篇博客<Git+Gitlab+Ansible剧本实现一键部署Nginx--技术流ken>,<Git+Gitlab+A ...

  9. Jenkins凭证及任务演示-pipeline(二)--技术流ken

    Jenkins前言 在上一篇博客<Jenkins持续集成介绍及插件安装版本更新演示(一)--技术流ken>中已经详细介绍了jenkins的插件安装以版本更新等,本篇博客将再深入探究jenk ...

随机推荐

  1. 开源方案搭建可离线的精美矢量切片地图服务-2.PostGIS+GeoServer矢量切片

    项目成果展示(所有项目文件都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵). 01:中国地图:http://test.sharegis.cn/mapbox/html/3china.ht ...

  2. jackson json转对象 json转集合 对大小写支持

    @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, isGetterVisibi ...

  3. 【深度学习篇】---CNN和RNN结合与对比,实例讲解

    一.前述 CNN和RNN几乎占据着深度学习的半壁江山,所以本文将着重讲解CNN+RNN的各种组合方式,以及CNN和RNN的对比. 二.CNN与RNN对比 1.CNN卷积神经网络与RNN递归神经网络直观 ...

  4. HWPushDemo【华为推送集成,基于2.6.1.301版本】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个Demo只是记录华为推送的集成,不能运行. 另外,因为可能用到存储权限,所以还需要搭配运行时权限申请功能. 使用步骤 一.项目组 ...

  5. ab性能测试工具的使用

    一.什么是ab ab,即Apache Benchmark,是一种用于测试Apache超文本传输协议(HTTP)服务器的工具. ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访 ...

  6. redis的bigkey扫描脚本

    众所周知,redis里面的大key存在是非常危险的一件事情.因为最近的工作转移到中间件相关的工作,因此关注了一下bigkey的扫描方法.首先介绍一下阿里云提供的扫描脚本: 具体可见:https://y ...

  7. Git操作GitHub时的Proxy配置

    无论是使用Android Studio中,VCS >> Git >> Clone, 还是直接Git Clone命令,clone GitHub项目时,出现错误提示:LibreSS ...

  8. 第四节 pandas 数据加载

    pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,其中read_csv和read_table这两个使用最多. #导包import pandas as pd from panda ...

  9. maven私服上传jar包

    将一下脚本保存在.bat文件执行,红色部分按实际情况修改: @echo off set groupId=com.xxxset artifactId=xxxset version=0.0.1set ja ...

  10. java_反射

    反射:reflect   成员属性:Field  成员方法:Method 构造方法:Constructor  类:Class 引用,援引:invoke   新实例:newInstance  Decla ...