shell编程一窗明月半帘风

在/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语句只会结束单次当前循环。

THE END
0.零基础入门到精通,看这一篇就够了编程最厉害的三个证书零基础入门,建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习; 搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime; ·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完; ·用Python编写漏洞的exp,然后写一个简单的网络爬虫jvzquC41dnuh0lxfp0tfv87624e96;5728=0c{ykenk0fnyckny03=;;25=59
1.蓝桥编程省三有用吗?可免考申领的《IITC工信人才岗位能力评价证书蓝桥编程省三有用吗?可免考申领的《IITC工信人才岗位能力评价证书》对于找工作有用吗? 双非本科信计大二暑假,想做些对实习和工作有用的事情,目前只参加过各类编程竞赛,朋友们给给建议。看蓝桥发的获奖可免考申领的《IITC工信人才岗位能力评价证书》,这对于实习和找工作有用吗? 全部评论 推荐 最新 楼层 等闲_ jvzquC41yy}/px|eqfks0lto1hkff8rckp5eg}fkn1gdc;;fgh7eg:92cgh449e7
2.计网复习协议定义了在两个或多个通信实体之间交换的报文格式和次序,以及在报文传输和/或接收或其他事件方面所采取的动作 协议=语法+语义+时序 二、网络边缘 1、网络结构 网路结构=网络边缘(主机、应用程序)+网络核心(路由器、网络的网络)+接入网与通信链路 2、 网络边缘:运行应用的端系统(端系统中的应用交互方式) jvzq<84jqok/w|ye0gjv0ls1€enbh8hqwtyf1wjvyqxl0qyon
3.竞争性谈判学前教育实训中心暨大学生活动中心贵宾室设备采购三、合同价格 十二、合同生效及其它 第七篇响应文件格式要求 一、经济部分 第一篇竞争性谈判邀请书 根据重庆市财政局关于印发《重庆市政府集中采购目录及采购限额标准》的通知(渝财规〔2020〕14号)文件精神,重庆工贸职业技术学院对学前教育实训中心暨大学生活动中心贵宾室设备采购项目(项目编号20210807)自主进行竞争性谈判采购。欢 jvzquC41yy}/ezlo{0io1rshq1716?4769
4.2019CCF大学生计算机系统与程序设计竞赛(分赛区)报名通知——2019年5月三、目的和简介 CCSP竞赛是旨在提高高校计算机教育水平的全国性的大学生竞赛,侧重选拔高水平人才。CCF CCSP分赛区竞赛按照全国区域划分为东北、华北、华中、华东、华南、西北、西南等7个分赛区,从而可以让更多的对计算机有兴趣的大学生参赛,以及不同地理区域的高校和企业更便捷、深入地参与进来。分赛区竞赛以CSP认证为初jvzquC41yy}/pnkw0gjv0ls1kplp1:5251=24>3jvo
5.喜讯|港中大(深圳)数据科学学院学生程序设计竞赛队再度进入世界部分赛站获奖证书 除教授导师,竞赛队教练工作还有学生的参与,学生助理教练由忙秋阳(数据科学学院大三学生、ICPC金奖获得者)、夏禹扬(数据科学学院大三学生、ICPC银奖获得者)和蒋一歌(数据科学学院大三学生、ICPC金奖获得者)组成。 赛绩汇总 奖牌情况 竞赛队所获奖牌5金4银3铜分别来自: jvzquC41ufy/e~mm0gjv0ls1ctzjeuj13585
6.2017CCF大学生计算机系统与程序设计竞赛(CCSP)报名通知1、题型和难度:一共三道题,前两道算法题,难度分别相当于CSP认证第三、四题的难度,第三道是一个系统设计与实现题。 2、各题分数:总分500分,三道题分别为150分、100分、250分。 3、编程语言:C/C++或Java。 4、竞赛方式:机考。 十二、注意事项 jvzquC41yy}/elk0qtm/ew4e1462965:/4>08993984tj}rn