在/etc/profile.d/*.sh文件中建立别名
2.1 建立练习文件
2.2 "*"前一个字符匹配0次,或任意多次
如果正则表达式写成"aa*"代表这行字符串一定要有一个a,但是后面有没有a都可以。也就是说会匹配至少含有一个a的行
如果正则表达式是"aaa*",则会匹配至少包含两个连续a的字符串
2.3 "."匹配除了换行符外任意一个字符
正则表达式"."只能匹配一个字符,这个字符可以是任意字符
2.4 "^"匹配行首,"$"匹配行尾
"^"匹配行首,如"^f"会匹配以小写"f"开头的行
"$"匹配行尾,如"d$"会匹配以小写"d"结尾的行
而"^$"会匹配空白行
2.5 "[]"匹配中括号中指定的任意一个字符,只匹配一个字符
"[]"会匹配中括号中指定的任意一个字符,注意只能匹配一个字符。比如[ab]不是匹配一个a字符,就是匹配一个b字符
"[0-9]"会匹配任意一个数字
"[A-Z]"会匹配一个大写字母
"^[a-z]"则会匹配以小写字母开头的行
2.6 "[^]"匹配中括号中的字符以外的任意一个字符
"^[^a-zA-Z]"会匹配不以字母开头的行
2.7 "\"转义符
2.8 "\{n\}"表示其前面的字符恰好出现n次
如果想要只显示三个连续的a,
如果正则是"[0-9]\{3\}"会匹配包含连续是三个数字的行
2.9 "\{n,\}"表示其前面的字符出现不小于n次
"\{n,\}"会匹配前面的字符出现最少n次。比如"fa\{3,\}z"这个正则就会匹配以f开头,z结尾,中间最少有三个a的字符串,"^[0-9]\{3,\}[a-z]"这个正则会匹配最少有连续三个数字开头的字符串
2.10 "\{n,m\}"匹配其前面的字符至少出现n次,最多出现m次
3. 扩展正则表达式
在正则表达式中还可以支持一些元字符,比如"+","?","|","()"。但是grep命令默认不支持。如果想要支持这些元字符,必须使用egrep命令或grep -E选项。故这些元字符被称为扩展元字符。
二、字符截取和替换命令
1. cut列截取命令
cut命令默认分隔符是制表符,就是"tab"键,但是对空格符的支持不好。
想要提取多列,只需列号之间使用","隔开即可
cut也可以按照字符提取,需要注意"8-"代表的是提取所有行的第八个字符开始到行尾,而"10-20"代表提取所有行的第十个字符到第二十个字符,而"-8"代表提取所有行从行首到第八个字符
2. awk
2.1 printf格式化输出
使用printf命令输出这个文件的内容
printf命令如果不指定输出格式,就会把所有输出内容连在一起输出。其实文本的输出本身就是这样的,cat等文本输出命令之所以可以按照格式输出,是因为cat命令已经设定了输出格式。为了printf输出合理的格式,
如果不把成绩当成字符串输出,而是按照整形和浮点型输出
2.2 awk基本使用
截取df命令的结果
2.3 awk的条件
2.3.1 BEGIN
BEGIN是awk的保留字,是一种特殊的条件类型。BEGIN的执行时机是在"awk程序一开始时,尚未读取任何数据之前执行"。一旦BEGIN后的动作执行一次,当awk开始从文件中读入数据,BEGIN的条件就不再成立,故BEGIN定义的动作只能被执行一次。例
2.3.2 END
END也是awk的保留字,只不过和BEGIN刚好相反。END是在awk程序处理完所有数据,即将结束时执行。END后的动作只在程序结束时执行一次。例
2.3.3 关系运算符
加入了条件之后,只有条件成立动作才会执行,如果条件不满足,则动作不会执行。虽然awk是列提取命令,但是也要按行来读入。这个命令的执行过程如下:
1)如果有BEGIN条件,则会执行BEGIN定义的动作
2)如果没有BEGIN条件,则读入第一行,把第一行的数据一次赋予$0、$1、$2等变量。其中$0代表此行的整体数据,$1代表第一字段,$2代表第二字段
3)依据条件类型判断动作是否执行。如果条件符合,则执行动作,否则读入下一行数据。如果没有条件,则每行都会执行动作
4)读入下一行数据,重复执行一行步骤
例,查看zs用户的平均成绩
这里要注意在awk中,使用"//"包含的字符串,awk命令才会查找。也就是说字符串必须用"//"包含,awk才能正确识别。
2.3.4 正则表达式
如果想让awk识别字符串,必须使用"//"包含。例
当使用df命令查看分区使用情况时,如果我只想查看真正的系统分区的使用状况,而不想看光盘和临时分区的使用状况,可以
2.4 awk内置变量
这里":"分隔符生效了,但是在第一行却没起作用,需加上"BEGIN"条件
2.5 awk流程控制
先看看如何在awk中定义变量与调用变量的值。假如我想统计LINUX成绩的总分,
解释一下这个命令。"NR==2{LINUX1=$4}"(条件是NR==2,动作是LINUX=$4)这句话指如果输入数据是第二行(第一行为标题行),就把第二行的第四列的值赋予变量"LINUX1"。"NR==2{LINUX1=$4}"这句话指如果输入数据是第三行,就把第三行的第四列的值赋予变量"LINUX1"。"NR==4{LINUX=$4;totle=LINUX1+LINUX2+LINUX3;print "totle linux is " totle}"("NR==4"是条件,后面{}中的都是动作)这句话指如果输入数据是第四行,就把第四行的第四列的值赋予变量"LINUX3";然后定义变量totle的值为"LINUX1+LINUX2+LINUX3";然后输出"totle linux is"关键字,然后加变量totle的值。
在awk中,因为命令语句非常长,在输入格式时需要注意以下内容:
多个条件{动作}可以用空格分割,也可以用回车分割
在一个动作中,如果需要执行多个命令,需要用";"分割,或者回车分割
在awk中,变量的赋值与调用都不需要加入"$"符
条件中判断两个值是否相同,使用"==",以便和变量赋值进行区分
再看一下如何实现流程控制,
其实在awk中if判断语句,完全可以直接利用awk自带的条件来取代
2.6 awk函数
awk编程也允许在编程时使用函数。awk函数的自定义方法:
2.7 awk中调用脚本
对于小的单行程序来说,将脚本作为命令行自变量传递给awk是非常简单的,而对于多行程序就比较难处理。当程序时多行的时候,使用外部脚本是很合适的。首先在外部文件中写好脚本,然后使用awk的-f选项,使其读入脚本并且执行。
例,先编写一个awk脚本
然后使用"-f"选项调用这个脚本
3. sed命令
sed主要是用来将数据进行选取、替换、删除、新增的命令
对sed命令需注意,sed所做的修改并不会直接改变文件的内容(如果是用管道符接受的命令的输入,这种情况连文件都没有),而是把修改结果只显示到屏幕上,除非使用"-i"选项才会直接修改文件。
3.1 行数据操作
"p"命令确实输出了第二行数据,但是sed命令还会把所有数据都输出一次,这是就会看到上述这个奇怪的结果。如果想要指定输出某行数据,需使用"-n"选项
如何删除文件的数据
如何追加和插入行数据
"a"会在指定行后面追加入数据,如果想要在指定行前面插入数据,则需要使用动作"i"
如果想要追加或插入多行数据,除最后一行外,每行的末尾都要加入"\"代表数据未完结。再来看看"-n"选项的作用
"-n"只查看sed命令操作的数据,而不是所有的数据。
如何实现行数据的替换。
sed命令默认情况是不会修改文件内容的,如果确定要让sed命令直接处理文件的内容,可以使用"-i"选项。该选项需谨慎使用。
3.2 字符串替换
"c"动作是进行行替换的,仅仅想要替换行中的部分数据,需使用"s"动作,格式如下:
替换的格式和vim非常类似
想把某行数据注释掉
在sed中只能指定行范围
"-e"选项可以同时执行多个sed动作,当然如果只是执行一个动作也可以使用"-e"选项,但是没什么意义。注意,多个动作之间要用";"号或回车分割。
三、字符处理命令
1. 排序命令sort
sort命令默认是用每行开头第一个字符来进行排序的,例
如果想反向排序,使用"-r"选项
想要指定排序的字段,需使用"-t"选项指定分隔符,并使用"-k"选项指定字段号,假如想要按照UID字段排序/etc/passwd文件
仔细看发现daemon用户的UID是2,却排在下面,这是因为sort默认是按照字符排序,前面用户的UID的第一个字符都是1,所有这么排序。要想按照数字排序,请使用"-n"选项
当然"-k"选项可以直接使用"-k 3",代表从第三字段到行尾都排序(第一个字符先排序,如果一致,第二个字符再排序,直到行尾)
2. uniq
uniq命令是用来取消重复行的命令,其实和"sort -u"选项都是一样的。格式如下:
3. wc统计命令
四、条件判断
1. 按照文件类型进行判断
多命令顺序执行"&&"和"||"。可以再判断一下/root/sh是否为目录
2. 按照文件权限进行判断
test是非常完善的判断命令,还可以判断文件的权限
3. 两个文件之间进行比较
如何判断两个文件是否为硬链接
4. 两个证书之间比较
5. 字符串的判断
如何判断两个字符串相等
6. 多重条件判断
逻辑非
五、流程控制
1. if条件判断
1.1 单分支if条件语句
单分支条件语句最简单,就是只有一个判断条件,如果符合条件则执行某个程序,否则什么事情都不做。语法如下:
单分支条件语句需要注意几个点:
if语句使用fi结尾,和一般语言使用大括号结尾不同
[ 条件判断式 ]就是使用命令判断,中括号和条件判断式之间必须有空格
then后面跟符合条件之后执行的程序,可以放在[]之后,用";"分割。也可以换行写入,就不需要";"了,如:
1.2 双分支if条件语句
例,数据备份
在工作中,服务器经常会宕机。通过脚本监听本机的服务,如果服务停止或宕机了,可以自动重启这些服务。以apache为例
nmap端口扫描命令,格式如下
1.3 多分支if条件语句
例,使用if多分支条件句判断用户输入的是一个文件还是目录
2. 多分支case条件语句
case语句和if···elif···else语句一样是多分支条件语句,不过和if多分支条件语句不同的是,case只能判断一种条件关系,而if语句可以判断多种条件语句。case语句语法如下:
这个语句需注意下述内容
case语句,会取出变量中的值,然后与语句体中的值逐一比较。如果数值符合,则执行对应的程序,如果数值不等,则依次比较下一个值。如果所有的值都不符合,则执行"*)" ("*"代表所有其他值)中的程序
case语句以"case"开头,以"esac"结尾。
每个分支程序之后要通过";;"双分号结尾,代表该程序段结束(不可忘记)。
例:判断是yes或no;
3. for 循环
for循环是固定循环,也就是循环时已经知道需要进行几次的循环,有时也把for循环称为计数循环。for循环有两种语法:
这种语法中for循环的次数,取决于in后面值的个数(空格分隔),有几个就循环几次,并且每次循环都把值赋予变量。
语法二中需要注意:
初始值:在循环开始时,需要给某个变量赋予初始值,如i=1;
循环控制条件:用于指定变量循环的次数,如i<=100,则只要i的值小于等于100,循环就会继续;
变量变化:每次循环之后,变量要如何变化,如 i=i+1。代表每次循环之后,变量i的值都加1。
3.1 语法一举例
例2,批量解压缩
3.2 语法二举例
语法二和其他语言中的for循环类似,事先决定循环次数的固定循环。
例1. 从1加到100
例2. 批量添加用户
例3. 批量删除用户
4. while循环
对while循环来讲,只有条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。
5. until循环
until循环与while循环相反,until循环只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,就终止循环。
6. 函数
7. 特殊流程控制语句
7.1 exit语句
系统使用exit命令的,用户退出当前用户的登录状态。在shell脚本中,exit语句是用来退出当前脚本的。就是说,在shell脚本中,只要碰到exit语句,后续的程序就不再执行,而直接退出脚本。语法如下:
如果exit命令之后定义了返回值,那么脚本执行之后的返回值就是我们自己定义的返回值。可以通过"echo $?"这个命令查看返回值。如果exit之后没有定义返回值,脚本执行之后的返回值是执行exit语句之前,最后执行的一条命令的返回值。
7.2 break语句
当程序执行到break语句时,会结束整个当前循环。而continue语句时结束本次循环。
break结束整个循环,continue结束此次循环,下次继续
7.3 continue语句
continue语句也是结束流程控制语句。在循环中,continue语句只会结束单次当前循环。