shell脚本

shell脚本

shell一个命令解释器,在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户
可以是交互式也可以是非交互式

在这里插入图片描述
输入的命令计算机时不识别的,需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们

常见的shell解释器程序有很多种,使用不同的shell解释器时,其 内部命令、命令行提示符等方面会存在一些区别,通过/etc/shells文件可以直到当前系统所支持的shell种类,其中/bin/bash时目前大多数linux版本采用的默认shell

1.什么是shell脚本

shell脚本(shell script):将要执行的命令按顺序保存到一个文本文件,并给该文件可执行权限,方便一次性执行的一个程序文件
常用于重复性操作、批量事务处理、自动化运维、服务运行状态监控、定时任务执行等

2. 附加知识

date命令:
命令功能:date 可以用来显示或设定系统的日期与时间。
显示时间:
date命令可以按照指定格式显示日期,只键入date则以默认格式显示当前时间。如下:

date

Sat Jun 15 16:51:13 CST 2019
如果需要以指定的格式显示日期,可以使用“+”开头的字符串指定其格式,详细格式如下:
%H : 小时(00-23)
%M : 分钟(00-59)
%S : 秒(00-60)
%X : 相当于 %H:%M:%S
%Z : 显示时区
%d : 日 (01-31)
%m : 月份 (01-12)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000-9999)
%D : 直接显示日期 (mm/dd/yy)
%F:显示日期,等同于%Y-%m-%d

设定时间:
date -s 01:01:01 #设置具体时间,不会对日期做更改
date -s “01:01:01 2019-06-15” #这样可以设置全部时间
date -s “01:01:01 20190615” #这样可以设置全部时间
date -s “2019-06-15 01:01:01” #这样可以设置全部时间
date -s “20190615 01:01:01” #这样可以设置全部时间

3. 命令解释器

Shell脚本格式:
SHELL脚本的第一行以 #! ,后面的路径名称是命令解释器。#!/bin/bash 作用:告诉脚本使用的是哪种命令解释器,此行以后的语句通过/bin/bash程序来解释执行。如不指shell,以当前shell作为执行的shell。大多数情况下,脚本的开头使用“#!/bin/bash”和“#!/bin/sh”, sh为bash的软链接。
在shell中以#开始头表示整个行就被当作一个注释。执行时被忽略。
shell程序一般以.sh结尾,当然主要是看是否为执行,然后看里面有没有#!

4. 脚本执行方式

4.1通过命令解释器执行脚本

bash test.sh 或 sh test.sh 不需要添加执行权限

4.2路径下执行脚本

/root/test.sh 或 ./test.sh 需要执行权限

4.3 source script-name 或 . script-name

不需要执行权限
source或者“.”命令的功能是:读入脚本并执行脚本,即在当前Shell中执行source或“.”加载并执行的相关脚本文件的命令及语句,而不是产生一个子Shell来执行文件中的命令。
注意:这是和其他几种执行shell方式的最大不同

5.创建shell脚本的步骤

1、写脚本(包含基本的命令和控制语句等)
2、检测语法错误 sh -n
3、添加执行权限
4、执行

6. 管道操作

管道操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入(处理对象)。同一行命令中可以使用多个管道

格式:cmd1命令|cmd2命令[…|cmdn命令]

7.重定向操作

1:标准输入(STDIN):默认的设备是键盘,文件编号为0,命令将从标准输入中读取在执行过程中需要的输入数据

2:标准输出(STDOUT):默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到显示器

3:标准错误(STDERR):默认的设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到显示器

7.1 重定向输入

重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用“<”操作符

7.2 重定向输出

将当前主机的CPU信息(uname -p)保存到kernel.txt文件中,而不是直接显示在屏幕上

7.3 错误重定向

错误重定向指的是将执行命令过程中出现的错误信息保存到指定的文件,而不是直接显示在屏幕上。错误重定向使用“2>”或“2>>”操作符,其中2是指错误文件的编号(在使用标准输出、输入重定向时,实际上是省略了1、0编号)

8.shell变量

变量是shell 传递数据的一种方法。变量是用来代表每个值的符号名。我们可以把变量当成一个容器,脚本可以在内存中存储数据,然后通过变量。就可以在脚本执行中进行修改和访问存储的数据

8.1 变量的设置规则

1变量名称通常是大写字母,它可以由数字、字母(大小写)和下划线_组成。变量名区分大小写;但是大家要注意变量名称不能以数字开头
2、等号 = 用于为变量分配值,在使用过程中等号两边不能有空格
3、变量存储的数据类型是整数值和字符串值
4、在对变量赋于字符串值时,建议大家用引号将其括起来,需要使用单引号或双引号。
5、要对变量进行调用,可以在变量名称前加美元符号$
6、如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“ 变 量 名 ” 或 用 变量名”或用 {变量名}包含

8.1.1 拓展变量值

n a m e 是 name是 name{name}的简化版本,但是在某些情况下,还必须使用花括号引起的方式来消除歧义并避免意外的结果
例如:
name=”Tom” //定义一个变量name,并将Tom字符串赋值给变量name
echo ${name}Li //如果不使用花括号引起变量名会变量name和Li混淆在一起产生歧义

8.1.2 命令替换

将执行某个命令的输出结果赋值给变量或作为另一个命令的处理对象(命令嵌套)
使用方式:(旧形式)我们将命令括在反引号中来调用命令结果,(新形式)是使用$()语法

8.2 算数拓展

进行算术扩展时使用 $ []或 $ (())进行,同时它也允许算术替换。算术扩展可以对算术表达式求值并替换成所求的值
格式:$((算术表达式))或 $[算数表达式]

8.2.1 变量运算

在这里插入图片描述

8.2.2 求余运算

在这里插入图片描述

8.3 变量分类

1、用户自定义变量
2、环境变量:这种变量中主要保存的是和系统操作环境相关的数据,例如PATH环境变量。
3、位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
4、预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

8.3.1 用户定义变量

变量名,由字母或下划线打头,不允许数字开头,后面由字母、数字或下划线组成,并且大小写字母意义不同。
变量赋值,在“=”后边直接指定变量内容是为变量赋值的最基本方法,注意,“=”两边没有空格
在这里插入图片描述
错误的赋值方式:不允许以数字开头,等号两边不能有空格
在这里插入图片描述
对变量赋值如果字符串内容存在空格的话,用引号把它引起来
在这里插入图片描述
变量值的叠加,使用${}
在这里插入图片描述
命令的替换,使用 ( ) 或 者 反 引 号 ‘ ‘ ! [ 在 这 里 插 入 图 片 描 述 ] ( h t t p s : / / i m g − b l o g . c s d n i m g . c n / 32 e 40 a c 421224002 a 7 c e 3703 f d 6 d 2 b 7 f . p n g ) ! [ 在 这 里 插 入 图 片 描 述 ] ( h t t p s : / / i m g − b l o g . c s d n i m g . c n / 19 c 54 f c 5 c 89 c 4 c e f b 87763 c 59 b 2 d 704 c . p n g ) 单 引 号 和 双 引 号 的 区 别 ! [ 在 这 里 插 入 图 片 描 述 ] ( h t t p s : / / i m g − b l o g . c s d n i m g . c n / 3 b 42218 c e 9654 d 458 b 013 d 6 b 541 f 0 a 2 c . p n g ? x − o s s − p r o c e s s = i m a g e / w a t e r m a r k , t y p e Z H J v a W R z Y W 5 z Z m F s b G J h Y 2 s , s h a d o w 5 0 , t e x t Q 1 N E T i B A U m V k Y W 1 h b m N 54 o C m 4 o C m , s i z e 1 4 , c o l o r F F F F F F , t 7 0 , g s e , x 1 6 ) 单 引 号 ( ’ ) : 当 要 赋 值 的 内 容 中 包 含 “ ()或者反引号 `` ![在这里插入图片描述](https://img-blog.csdnimg.cn/32e40ac421224002a7ce3703fd6d2b7f.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/19c54fc5c89c4cefb87763c59b2d704c.png) 单引号和双引号的区别 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3b42218ce9654d458b013d6b541f0a2c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAUmVkYW1hbmN54oCm4oCm,size_14,color_FFFFFF,t_70,g_se,x_16) 单引号(’): 当要赋值的内容中包含“ ()![](https://imgblog.csdnimg.cn/32e40ac421224002a7ce3703fd6d2b7f.png)![](https://imgblog.csdnimg.cn/19c54fc5c89c4cefb87763c59b2d704c.png)![](https://imgblog.csdnimg.cn/3b42218ce9654d458b013d6b541f0a2c.png?xossprocess=image/watermark,typeZHJvaWRzYW5zZmFsbGJhY2s,shadow50,textQ1NETiBAUmVkYW1hbmN54oCm4oCm,size14,colorFFFFFF,t70,gse,x16):”“””“\”等具有特殊含义的字符时,应使用单引号括起来,将无法引用其他变量的值,任何字符均作为普通字符看待。即单引号之间的内容原封不动赋值给变量
双引号(”):
双引号之间的内容如有特殊符号会保留它的特殊含义

8.3.2 环境变量

分类:
全局变量
局部变量
定义:
全局变量对于shell和所有的子shell都是有效的
局部变量它只在当前的shell环境中有效,当进入子程序或新的子shell环境时,局部变量将无法再使用

8.3.2.1 全局变量

查看全局变量:env 或 printenv
在这里插入图片描述

8.3.2.2 局部变量转化为全局变量

通过export把这个局部变量输出为全局变量
在这里插入图片描述
执行export
在这里插入图片描述
注:为了使用户定义的变量在所有的子shell环境中能够继续使用,可以通过内部命令export将指定的变量设置为全局变量。可以同时指定多个变量名称作为参数(不需要使用“$”符号),变量名之间以空格分隔
使用export设置为全局变量的同时,也可以为变量进行赋值,这样在新定义全局变量时就不需要提前进行赋值了

8.3.2.3 使变量永久生效

/etc/profile 是shell的主启动文件,只要你登录,bash会就执行这个文件,针对所有用户都生效。
$HOME/.bash_profile 作用和上面一样的,它是用户的专属配置文件
例如:
[root@localhost ~]# vim /etc/profile
配置文件生效的二种方式:
1.退出当前用户,重新进入
2.执行source命令
[root@localhost ~]# source /etc/bash_profile

8.3.2.3 变量的删除

unset 变量

8.3.2.4 设置PATH环境变量

SHELL要执行某一个程序,它要在系统中去搜索这个程序的路径
PATH变量是用来定义命令和程序搜索路径的,当仅指定文件名称来执行命令程序时,linux系统将在PATH变量指定的目录范围查找对应的可执行文件,如果找不到则会提示“command not found”。当我们安装了第三方程序后,可以把第三方程序bin目录添加到这个PATH路径内,就可以在全局调用这个第三方程序的

8.3.2.5 位置变量

Shell解释执行用户的命令时,将命令行的第一个字作为命令名,而其它字作为参数。由出现在命令行上的位置确定的参数称为位置参数
使用 $ N 来表示
$ 0 获取当前执行shell脚本或程序的名称,包括脚本路径,命令本身。注意:$ 0属于预定义变量而不是位置变量。
$ n 获取当前脚本的第n个参数 n=1,2…n 当n大于9时 用${10}表示
#!/bin/bash
echo “执行的程序或脚本名称:$0”
echo “第一个参数:$1”
echo “第二个参数:$2”
echo “第三个参数:$3”
echo “第四个参数:$4”

8.3.2.5 其他常用的环境变量

环境变量USER表示当前登录系统的用户名称
环境变量HOME表示用户的宿主目录
环境变量LANG表示语言和字符集
环境变量PWD表示当前所在的工作目录

8.3.2.6 特殊变量
8.3.2.6.1 预定义变量

有些变量是一开始执行Script脚本时就会设定,且不能被修改,我们叫他们为预定义变量
在这里插入图片描述
例如1:
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7
echo “脚本的名字 $0”
echo “当前参数的个数为: $#”
echo “参数列表一: $*”
echo “参数列表二: @ " e c h o " 上 条 命 令 的 执 行 结 果 : @" echo "上条命令的执行结果: @"echo"?”

例如2:
a b c d e
脚本的名字 test3.sh
当前参数的个数为: 5
参数列表一: a b c d e
参数列表二: a b c d e
上条命令的执行结果:0

8.3.2.6.2 $ *与$@区别

相同点:都是引用所有参数
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 “1 2 3”(传递了一个参数,保持一个整体),而 “@” 等价于 “1” “2” “3”(传递了三个参数,分开)

9 数学运算

9.1 expr命令

9.1.1 对数字的基本计算

expr只能进行简单的整数运算,不支持小数运算,运算符和运算数之间至少要有一个空格。
注:做数字大小比较时,输出结果假为0,1为真;特殊符号用转义符
在这里插入图片描述
需要注意的是乘法运算,不能仅使用“*”符号,否则将被当成文件的通配符。需要用转义符“\”进行转义。以上操作也可以使用变量

9.1.2 对字符串

在这里插入图片描述

9.2 使用双括号(())

数值运算的常见命令: ( ( ) ) 、 l e t 等 格 式 : (())、let等 格式: (())let((表达式1,表达式2))
特点:
1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b–等。a++ 等价于 a=a+1
2、在双括号结构中,所有变量可以不加入:“ ” 符 号 前 缀 。 ( 当 然 变 量 名 前 也 可 以 ”符号前缀。(当然变量名前也可以
3、双括号可以进行逻辑运算,四则运算
4、双括号结构 扩展了for,while,if条件测试运算
5、支持多个表达式运算,各个表达式之间用“,”分开

9.2 .1 常用的算数运算符

在这里插入图片描述

9.3 使用方括号 [ ]

在这里插入图片描述

9.4 浮点运算 bc

bc是一个工具
在这里插入图片描述
输入quit退出

10 添加测试语句和if流程控制语句的使用

10.1 read命令

除了“=”方式给变量赋值外,还可以使用bash的内置命令read来给变量赋值

10.1.1 定义

read命令用来提示用户从键盘读入数据,赋给变量。从而实现简单的交互过程

10.1.2 语法格式

read [选项] [变量名1] [变量名2]……
-p:用来设置提示信息
-t:设置等待时间,单位是秒,若在规定时间内未输入自动跳出。
执行时将从标准输入设备(键盘)读入一行内容,并以空格作为分隔符,将读入的各字段挨个赋值给指定的变量,多余的内容赋值给最后一个变量。若指定的变量只有一个,则将整行内容赋值给此变量

10.2 test测试命令

检查某个条件是否成立,可以对数值、字符、和文件的测试
格式:test 测试条件 或[ 测试条件 ]
注意事项:中括号两边要有空格
条件测试常见的几种语法形式:
test 表达式
[ 表达式 ]
注意事项,中括号两边要有空格
其中:test和[ ]是等价的

10.2.1 整数值比较

在这里插入图片描述

10.2.2 文件比较

在这里插入图片描述

10.2.3 字符串比较

在这里插入图片描述
注意:对于进行字符串的测试,一定要将字符串加上双引号然后再进行比较,一定要注意空格,一般用在[ ]里面

10.2.4 逻辑操作符

在这里插入图片描述
注:[[ ]]是扩展test命令,&& 、|| 、> 、<像这样符号可以用在[[ ]]中,不能用在[ ]中

10.3 流程控制语句if

10.3.1 单分支

If语句的“分支”指的是不同测试结果所对应的执行语句(一条或多条)。对于单分支的选择结构,只有在“条件成立”时才会执行相应的代码,否则不执行任何操作
语法:
if [ 条件判断 ] //方括号和条件判断之间至少一个空格
then
commands
fi

if [ 条件判断 ] ; then
commands
fi
在使用单分支 if 条件查询时需要注意几点:
if 语句使用 fi 结尾。
[ 条件判断 ] 就是使用 test 命令判断,所以中括号和条件判断之间必须有空格。
then 后面跟符合条件之后执行的程序,可以放在 [] 之后,用";“分隔;也可以换行写入,就不需要”;"了

10.3.2 多分支

在双分支 if 条件语句中,当条件判断式成立时,则执行某个程序;当条件判断式不成立时,则执行另一个程序
格式:
if [ 条件判断 ]
then
commands
else
commands
fi

10.3.3 多分支

在多分支 if 条件语句中,允许执行多次判断。也就是当条件判断 1 成立时,执行程序 1;当条件判断 2 成立时,执行程序 2;依次类推,当所有条件不成立时,执行最后的程序
格式:
If [ 条件判断1 ] ; then
commands
elif [ 条件判断2 ] ; then
commands
elif [ 条件判断3 ] ; then
commands

else
commands
Fi

11. shell中的色彩处理

shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用选项-e(可以用来识别我们的转义字符)
格式:
echo -e “\033[背景颜色;文字颜色m 文字内容\033[0m”
echo -e “\e[背景颜色;文字颜色m 文字内容\e[0m”

echo -e “\033[文字颜色 m;背景颜色; 文字内容\033[0m 文字”
echo -e “\e[背景颜色;文字颜色m  文字内容\e[0m 文字”

注:
  1、背景颜色和文字颜色之间是英文的分号";"
  2、文字颜色后面有个m
3、字符串前后可以没有空格,如果有的话,输出也是同样有空格
4、echo显示带颜色,需要使用参数-e

11.1 文字颜色

字颜色:30—37
echo -e “\033[30m 黑色字 \033[0m”
echo -e “\033[31m 红色字 \033[0m”
echo -e “\033[32m 绿色字 \033[0m”
echo -e “\033[33m 黄色字 \033[0m”
echo -e “\033[34m 蓝色字 \033[0m”
echo -e “\033[35m 紫色字 \033[0m”
echo -e “\033[36m 天蓝字 \033[0m”
echo -e “\033[37m 白色字 \033[0m”

11.2 背景颜色

背景颜色范围:40—47
echo -e “\033[40;37m 黑底白字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
echo -e “\033[42;37m 绿底白字 \033[0m”
echo -e “\033[43;37m 黄底白字 \033[0m”
echo -e “\033[44;37m 蓝底白字 \033[0m”
echo -e “\033[45;37m 紫底白字 \033[0m”
echo -e “\033[46;37m 天蓝底白字 \033[0m”
echo -e “\033[47;30m 白底黑字 \033[0m”

11.3 控制选项

\033[0m 关闭所有属性
\033[1m 设置高亮度,加粗
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显

12 结构化命令case和for、while循环

12.1 流程控制语句:case

控制语句即用来实现对程序流程的选择、循环、转向和返回等进行控制
case是根据变量的不同取值进行比较,然后针对不同的取值分别执行不同的命令操作

12.1.2 格式

适用于多分支,是一个多选择语句
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
……
*)
;;
默认命令序列
esac

12.1.3 cese的执行流程

在这里插入图片描述
case条语句需要注意以下内容:
case 语句会取出变量中的值,然后与语句体中的值逐一比较。如果数值符合,则执行对应的程序;如果数值不符,则依次比较下一个值;如果所有的值都不符合,则执行")",("“代表所有其他值)中的程序。
case 语句以"case"开头,以"esac"结尾。
在每个分支程序之后要以”;;"(双分号)结尾,代表该程序段结束(千万不要忘记

12.2 循环语句

12.2.1 for

使用for循环语句时,需要指定一个变量及取值列表,针对每一个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。在这里,“取值列表”称为for语句的执行条件。
for 循环是固定循环,也就是在循环时已经知道需要进行几次循环。有时也把 for 循环称为计数循环

12.2.1.1 格式

for 变量名 in 变量取值列表
do
commands
done

12.2.1.2 执行流程

在这里插入图片描述
for 循环的次数取决于 in 后面值的个数(以空格分隔),有几个值就循环几次,并且每次循环都把值赋予变量
do……done之间的命令序列称为循环体,其中的执行语句需要引用变量以完成相应的任务

12.2.2 while

重复判断条件测试操作,只要条件成立就反复执行对应的命令序列(循环体),直到条件测试不成立或为假

12.2.2.1 格式

while 条件测试操作
do
命令序列
done

12.2.2.2 执行流程

在这里插入图片描述
注意:避免陷入死循环, 条件测试设置为while true 或while false ,循环退出根据测试条件的退出码来定,一定要设置退出条件

13 shift位置参数左移、函数、退出循环

13.1 shift位置参数左移指令

13.1.1 定义

shift命令用于对位置参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理

13.1.2 作用

每执行一次,位置参数序列顺次左移一个位置,$#的值减1,用于分别处理每个参数,移出去的参数,不再可用,例如执行一次shift位置参数就左移一次,原来的第一个位置参数被移出去了,不再可用,第二个位置参数成了第一个位置参数,依次类推

13.2 函数的使用

函数:把一个功能封装起来。使用时直接调用函数名。这样的脚本好处:模块化,代码可读性强

13.2.1 函数创建

注意:
1、其中function是可选的,这个可以省略掉。name是函数唯一的名称,函数名后面加一个(),里面是没有内容的。而我们执行的命令序列放在{}里面的,由{ }包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。return value表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写。
2、在定义函数的时候,必须要在执行程序前面定义或加载(即必须在调用函数地方之前,定义好函数)
3、在执行函数时(调用函数),函数前面的function和函数后面的小括号都不要写,直接写函数名就可以了

方法一:
function name() {
命令序列
[return value]
}

方法二:
name() {
命令序列
[return value]
}

13.2.2 函数的返回值

通过return命令来退出函数并返回特定的退出码
return命令可以使用单个整数值来定义函数退出状态,提供了一种通过编程设置函数退出状态的简单方法。
注:return语句返回一个退出值给调用函数的程序,而exit的返回值是给执行程序当前的SHELL
在使用这个返回状态码的时候,要注意以下2点:
状态码必须要在函数一结束就进行取值。
状态码的取值范围(0~255)

13.2.3 向函数传递参数

第一种情况:
函数可以使用位置参数变量来表示要传递给函数的参数。
函数名在变量 $0 中定义, 函数命令行的其他参数使用变量 $1、$2…, $#可以用来确定传递给函数的参数数目

第二种情况:
函数无法从脚本命令行(shell提示符中)直接访问脚本参数值。如果想在函数中使用这些值,那么必须在调用该函数时手动传递这些数据

13.3 跳出循环

在我们使用循环语句进行循环的过程中,有时候需要在未达到循环结束条件时强制跳出循环,那么Shell给我们提供了两个命令来实现该功能:break和continue
注:exit:退出当前整个脚本的

13.3.1 Break

结束并跳出当前循环,在for、while等循环语句中,用于跳出当前所在的循环体,执行循环体之后的语句,后面如果什么也不加,表示跳出当前循环等价于break 1,也可以在后面加数字,假设break 3表示跳出三层循环

13.3.2 Continue

忽略本次循环剩余的代码,直接进行下一次循环;在for、while等循环语句中,用于跳出当次循环,直接进入下一次循环

14 正则表达式和sed使用

14.1 正则表达式的使用

14.1.1 概念

正则表达式(或称Regular Expression,简称RE),是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的分割,匹配、査找及替换操作。即正则表达式是一种文本模式
在这里插入图片描述
正则表达式是用来匹配文件中的字符串的方法

把整个文本分成一行一行的字符串,然后从每行字符串中搜索是否有符合正则表达式规则的字符串,如果有则匹配成功,没有则匹配失败

注:正则表达式和通配符的区别(正则表达式用来在文件中匹配符合条件的字符串,通配符用来匹配符合条件的文件名)。其实这种区别只在 Shell 中适用,因为用来在文件中搜索字符串的命令,如 grep、awk、sed、vi 等可以支持正则表达式,而在系统中搜索文件的命令,如 ls、find、cp 等不支持正则表达式,所以只能使用shell的通配符来进行匹配

14.1.2 基础元字符

在这里插入图片描述

14.1.2 拓展元字符

在这里插入图片描述
注:"+"、"?"、"|"、"()"、"{}“等扩展元字符egrep命令或grep -E是支持的。grep命令在不加-E选项的情况下可以按如下格式写:”+"、"?"、"|"、"()"、"{}"

14.2 sed命令

全名:stream editor 流编辑器
无交互式编辑文本
支持正则表达式,使用拓展正则夹参数 -r

14.2.1执行过程

1、首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间)。
2、然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。
3、sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。
4、处理完输入文件的最后一行后,sed便结束运行

14.2.2 格式

sed 【选项】 “【指令】” 文件名

14.2.3 选项

-n:默认情况下,sed在动作指令执行完毕后,自动输出处理后的内容,该选项会屏蔽默认输出
-e:执行多个sed指令
-i:直接修改源文件
-i.bak:编辑源文件的同时创建.bak的备份
-r:使用拓展的正则表达式

动作指令:
p :打印,输出指定的行
s :替换,替换指定字符串
d :删除,删除行
a :增加行,在当前行下面插入文件
i:增加行,在当前行上面插入文件
c :把选定的行改为新的指定的文本内容
r :读取文件,用于将一个独立文件的数据插入到当前数据流的指定位置
w :另存为

注意:动作指令要是用单引号或双引号括起来

15. awk应用

awk也是一个数据处理工具!相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个字段来处理

和 sed 命令类似,awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理
在linux上常用的是gawk,awk是gawk的链接文件

15.1 格式

awk [-F field-separator] ‘commands’ filename
[-F域分隔符]是可选的
commands 是awk要执行的命令动作
filename是要处理的文件

15.1.1 匹配规则{执行命令}

完整格式:awd [-F field-separator] ‘匹配规则{执行命令}’ filename
任何awk语句都是由’匹配规则{执行命令}'组成,一个awk中可以有多个语句。匹配规则决定执行命令的执行条件

15.1.2 匹配规则(执行条件)

在这里插入图片描述

15.2 使用数据字段变量

awk 的主要特性之一是其处理文本文件中数据的能力,它会自动给一行中的每个数据字段分配一个变量
默认情况下,awk 会将如下变量分配给它在文本行中发现的数据字段:
$0 代表整个文本行;
$1 代表文本行中的第 1 个数据字段;
$2 代表文本行中的第 2 个数据字段;
$n 代表文本行中的第 n 个数据字段。

15.3 执行命令(动作action)

awk的执行命令在大括号{ }内指明。动作大多数用来打印(即print指令)
动作(action):
格式化输出(print)
流程控制语句(if、while、for等)

15.4 awk中的BRGIN和END

完整语法:
awk [options] ‘BEGIN{ print “start” } 匹配规则{ commands } END{ print “end” }’ filename

BEGIN:开始块
END:结束块

15.4.1 GEGIN模块

BEGIN 的执行时机是"在 awk 程序一开始,尚未读取任何数据之前"。一旦BEGIN后的动作执行一次,当awk开始从文件中读入数据时,BEGIN 的条件就不再成立,所以BEGIN定义的动作只能被执行一次

15.4.2 END模块

END也是awk的保留字,不过刚好和 BEGIN 相反。END 是在 awk 程序处理完所有数据,即将结束时执行的。END 后的动作只在程序结束时执行一次

15.5 awk工作过程

在这里插入图片描述
在这里插入图片描述
1.如果BEGIN块存在,awk执行它指定的actions。
2.awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取),awk将读入的记录分割成多个字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。
3、把当前输入记录与awk中’匹配规则{执行命令}'中的“匹配规则”比较,看是否匹配,如果相匹配,就执行对应的‘执行命令’。如果不匹配,就跳过对应的执行命令。
4、awk读取输入的下一行,继续重复步骤2和3,这个过程一直持续,直到awk读取到文件尾。
5、当awk读完所有的输入行后,如果存在END,就执行相应的actions

15.5 awk变量

15.5.1 自定义变量

自定义变量:用户自己定义的变量
-v varname=value 变量名区分字符大小写

例如:统计用户数量
awk -v var=“统计用户数” -v count=0 -F: ‘BEGIN{print var} {count++} END{print “user count is:”,count}’ /etc/passwd

在program中直接定义,以下定义了3个自定义变量,其实形式像编程语言一样,定义的时候用分号。打印变量跟之前一样,用逗号隔开,注意,不需要用美元符号
awk ‘BEGIN{my_name=“berry”;my_age=22;my_sex=“男”;print my_name,my_age,my_sex}’

引用命令行定义的变量
统计root目录下文件占用的字节数(以MB显示)

ls -l /root/ | awk ‘BEGIN{size=0;}{size=size+$5;} END{print “size is:” size/1024/1024"MB"}’

统计root目录下每个文件的大小及其总和,但要排除子目录

ls -l /root/ | awk ‘BEGIN{sum=0} /[d]/ {print $9 “\t” $5;sum+=$5} END{print “to tal size(MB):” sum/1024/1024}’

15.5.2 预定义变量

$n : 当前记录(当前行)的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段
$0 :这个变量包含执行过程中当前行的文本内容
FILENAME :当前输入文件的名
FS :字段分隔符(默认是任何空格)
NF :表示字段数,在执行过程中对应于当前的字段数
NR :表示记录数,在执行过程中对应于当前的行号
FNR :各文件分别计数的行号

15.5.3 awk控制语句

15.5.3.1 if语句

if (条件) print
if(条件){print}else{print}
if(条件){print}else if(条件){print}else{print}

例如:
查找系统用户或者其他用户
awk -F: ‘{if($3<1000){print “system_user=”$1}else{print “ordinary_user=”$1}}’ /etc/passwd

15.5.3.2 while循环

语句:while(条件){语句} 如果条件为“真”进入循环,条件为“假”退出循环

15.5.3.3 for循环

语法:for(变量赋值;条件;迭代){命令}

15.3.3.3.1 偶数(next)

打印奇数或偶数行

偶数行:awk ‘NR%20{print NR,$0}’ 文件名
奇数行:awk 'NR%2
1{print NR,$0}’ 文件名

15.3.3.3.2 数组

是一个包含一系列元素的集合
格式:
abc[1]=”xiaohong”
abc[2]=”xiaolan”
解释:
abc :为数组名称
[1]、[2]:为数组元素下标,可以理解为数组的第1个元素、数组的第2个元素
”xiaohong”、”xiaolan”: 元素内容

在引用数组变量的时候,必须要包含它的下标值,然后通过下标值来提取它相对应的元素值

数组应用范围:
array[“index”]++ 每循环一次这个索引所对应的元素值加1(初始值默认是0)

16. cut命令

cut是一个选取命令,就是将一段数据经过分析,取出我们想要的

主要参数

-d :自定义分隔符,默认为制表符
-f :与-d一起使用,指定显示哪个区域

例如:
取/etc/passwd的第七行内容
cut -d: -f7 /etc/passwd

17. 脚本综合

系统管理工具

需求
类似++++系统管理工具箱++++++
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值