【文档说明】Linux网络操作系统项目教程-项目7-熟练使用vim程序编辑器与shell课件.pptx,共(50)页,930.774 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-7176.html
以下为本文档部分文字说明:
Linux网络操作系统项目教程项目七熟练使用vim程序编辑器与shell2项目导入①学会使用vim编辑器。②了解shell的强大功能和shell的命令解释过程。③学会使用重定向和管道的方法。④掌握正则表达
式的使用方法。职业能力目标和要求系统管理员的一项重要工作就是要修改与设定某些重要软件的配置文件,因此系统管理员至少要学会使用一种以上的文字接口的文本编辑器。所有的Linux发行版本都内置有vi文本编辑器,很多软件也默认使用vi作为编辑的接口,vim是进阶版的vi,
因此读者一定要学会使用vi文本编辑器。vim不但可以用不同颜色显示文本内容,还能够进行诸如shellscript、Cprogram等程序的编辑,因此,可以将vim视为一种程序编辑器。项目七熟练使用vim程序编辑器与shell37.1熟练使用vim程序编辑器7.2熟练掌握shell环境变量7.3熟
练掌握正则表示法7.4掌握输入输出重定向与管道命令的应用7.5项目实录47.1任务1熟练使用vim编辑器vim是vimsualinterface的简称,它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制。这是其他编辑程序所没有
的。vim不是一个排版程序,它不像Word或WPS那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。vim是全屏幕文本编辑器,没有菜单,只有命令。vi编辑器的使用7.1.1子任务1启动和退出vim在系统提示符后输入vim和想要编辑(或建立)的文件名,便可进入vim,如:[r
oot@RHEL7-1~]#vimmyfile5如果只输入vim,而不带文件名,也可以进入vim,如图7-1所示。图7-1vim编辑环境在编辑模式下(初次进入vim不做任何操作就是编辑模式)键入:q,:q!,:wq或:x(注意:号),就会退出vim。其中
:wq和:x是存盘退出,而:q是直接退出。如果文件已有新的变化,可以用:w命令保存文件后再用:q退出,或用:wq或:x命令退出。如果你不想保存改变后的文件,就需要用:q!命令。这个命令将不保存文件而直接退
出vim,例如::w保存:wfilename另存为filename:wq!保存退出:wq!filename注:以filename为文件名保存后退出:q!不保存退出:x应该是保存并退出,功能和:wq!相同67.1.2子任务2熟
练掌握vim的工作模式vim有3种基本工作模式:编辑模式、插入模式和命令模式。1.编辑模式进入vim之后,首先进入的就是编辑模式。进入编辑模式后,vim等待编辑命令输入而不是文本输入。进入编辑模式后光标停在屏幕第一行首位
,用_表示,其余各行的行首均有一个“~”符号,表示该行为空行。最后一行是状态行,显示出当前正在编辑的文件名及其状态。如果是[NewFile],则表示该文件是一个新建的文件;如果输入vim带文件名后,文件已在系统中存在,则在屏幕上显示出该文件的内容,并且光标停在第一行的首位,
在状态行显示出该文件的文件名、行数和字符数。2.插入模式在编辑模式下按下相应的键可以进入插入模式:插入命令i、附加命令a、打开命令o、修改命令c、取代命令r或替换命令s都可以进入插入模式。在插入模式下,用户输入的任何字符都被vim当作文
件内容保存起来,并将其显示在屏幕上。在文本输入过程中(插入模式下),若想回到编辑模式下,按“Esc”键即可。73.命令模式在编辑模式下,用户按“:”键即可进入命令模式。此时vim会在显示窗口的最后一行(通常
也是屏幕的最后一行)显示一个“:”作为命令模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的。末行命令执行完后,vim自动回到编辑模式。若在命令模式下输入命令的过程中改变了主意,可在用退格键将输入的命令全部删除之后,再按一下退格键,即可使
vim回到编辑模式。87.1.3子任务3使用vim命令1.在编辑模式下的命令说明在编辑模式下,光标移动、查找与替换、复制粘贴等的说明分别如表7-1、表7-2和表7-3所示。移动光标的方法h或向左箭头键(←)光标向左移动一个字符
j或向下箭头键(↓)光标向下移动一个字符k或向上箭头键(↑)光标向上移动一个字符l或向右箭头键(→)光标向右移动一个字符Ctrl+f屏幕向下移动一页,相当于“PageDown”键(常用)Ctrl+b屏幕向上移动一页,相当于“PageUp”键(常用)Ctrl+d屏幕向下移动半页
Ctrl+u屏幕向上移动半页+光标移动到非空格符的下一列-光标移动到非空格符的上一列n<space>n表示数字,例如20。按下数字后再按空格键,光标会向右移动这一行的n个字符。例如输入20<space>则光标会向后面移动20个字符距离
0或功能键“Home”这是数字0:移动到这一行的最前面字符处(常用)$或功能键“End”移动到这一行的最后面字符处(常用)H光标移动到这个屏幕的最上方那一行的第一个字符M光标移动到这个屏幕的中央那一行的第一个字符L光
标移动到这个屏幕的最下方那一行的第一个字符G移动到这个文件的最后一行(常用)nGn为数字。移动到这个文件的第n行。例如输入20G则会移动到这个文件的第20行(可配合:setnu)gg移动到这个文件的第一行,相当于1G(常用)n<Ente
r>n为数字。光标向下移动n行(常用)查找与替换/word向光标之下寻找一个名称为word的字符串。例如要在文件内查找myweb这个字符串,就输入/myweb即可(常用)?word向光标之上寻找一个名称为word的字符
串n这个n是英文按键。代表重复前一个查找的动作。举例来说,如果刚刚我们执行/myweb去向下查找myweb这个字符串,则按下n后,会向下继续查找下一个名称为myweb的字符串。如果是执行?myweb,那么按下n则会向上继续查找名称为m
yweb的字符串N这个N是英文按键。与n刚好相反,为反向进行前一个查找动作。例如执行/myweb后,按下N则表示向上查找myweb使用/word配合n及N是非常有帮助的!可以让你重复地找到一些查找的关键词:n1,n2s/word1
/word2/gn1与n2为数字。在第n1~n2行寻找word1这个字符串,并将该字符串取代为word2!举例来说,在100~200行查找myweb并取代为MYWEB则输入“:100,200s/myweb
/MYWEB/g”(常用):1,$s/word1/word2/g从第一行到最后一行寻找word1字符串,并将该字符串取代为word2(常用):1,$s/word1/word2/gc从第一行到最后一行寻找word1字符串,并将该字符串取代
为word2!且在取代前显示提示字符给用户确认(confirm)是否需要取代(常用)表7-1编辑模式下的光标移动的说明表7-2编辑模式下的查找与替换的说明9删除、复制与粘贴x,X在一行字当中,x为向后删除一个字符(相当于“Del”键
),X为向前删除一个字符(相当于Backspace,退格键)(常用)nxn为数字,连续向后删除n个字符。举例来说,要连续删除10个字符,输入10xdd删除光标所在的那一整列(常用)nddn为数字。删除光标所在的向下n列,例如,20dd是删除20列(常用)
d1G删除光标所在到第一行的所有数据dG删除光标所在到最后一行的所有数据d$删除光标所在处,到该行的最后一个字符d0那个是数字0,删除光标所在行的前一字符到该行的首个字符之间的所有字符yy复制光标所在的那一行(常用)
nyyn为数字。复制光标所在的向下n列,例如20yy是复制20列(常用)y1G复制光标所在列到第一列的所有数据yG复制光标所在列到最后一列的所有数据y0复制光标所在的那个字符到该行行首的所有数据表7-3编辑模式下删除
、复制与粘贴的说明y$复制光标所在的那个字符到该行行尾的所有数据p,Pp为将已复制的数据在光标下一行粘贴上,P则为粘贴在光标上一行!举例来说,目前光标在第20行,且已经复制了10行数据,则按下p后,那10行数据会粘贴在原来的20行之后,即由21行开始粘贴。但如果是按下P呢?将会在光标之前粘贴,
即原本的第20行会变成第30行(常用)J将光标所在列与下一列的数据结合成同一列c重复删除多个数据,例如向下删除10行,输入10cju复原前一个动作(常用)Ctrl+r重做上一个动作(常用).不要怀疑!这就是小数点!意思是重复前一个动作的意思。如果你想要重复删除、重复粘贴等动作
,按下小数点就可以(常用)102.进入插入模式的命令说明编辑模式切换到插入模式的可用的按键的相关说明如表7-4所示。类型命令说明进入插入模式i从光标所在位置前开始插入文本I该命令是将光标移到当前行的行首,然后插入文本类型命令说明进入插入模式a用于在光标当前所在位
置之后追加新文本A将光标移到所在行的行尾,从那里开始插入新文本o在光标所在行的下面新开一行,并将光标置于该行行首,等待输入O在光标所在行的上面插入一行,并将光标置于该行行首,等待输入Esc退出编辑模式或回到编辑模
式中(常用)表7-4进入插入模式的说明说明:上面这些按键中,在vim画面的左下角处会出现“--INSERT--”或“--REPLACE--”的字样。由名称就知道该动作了。需要特别注意的是,我们上面也提过了,想要在文件里面输
入字符,一定要在左下角处看到INSERT或REPLACE才能输入。113.命令模式的按键说明如果是插入模式,先按“Esc”键进入编辑模式。在编辑模式下按“:”进入命令模式。保存文件、退出编辑等的命令按键如
表7-5所示。:w将编辑的数据写入硬盘文件中(常用):w!若文件属性为只读时,强制写入该档案。不过,到底能不能写入,还与你对该文件拥有的权限有关:q退出vim(常用):q!若曾修改过文件,又不想储存,则使用“!”强制退出而不储存文件。注
意一下,惊叹号(!)在vim当中,常常具有强制的意思:wq储存后离开,若为“:wq!”,则为强制储存后离开(常用)ZZ这是大写的Z。若文件没有更改,则不储存离开;若文件已经被更动过,则储存后离开:w[filename]将编辑的数据储存成另一个文件(类似另存
为新文件):r[filename]在编辑的数据中,读入另一个文件的数据,即将filename这个文件内容加到光标所在行的后面:n1,n2w[filename]将n1到n2的内容储存成filename这个文件:!command暂时退出vim到命令列模式
下执行command的显示结果。例如,“:!ls/home”即可在vim当中察看/home底下以ls输出的文件信息:setnu显示行号,设定之后,会在每一行的前缀显示该行的行号:setnonu与:se
tnu相反,为取消行号表7-5命令模式的按键说明127.1.4子任务4完成案例练习1.本次案例练习的要求(RHEL7-2上实现)(1)在/tmp目录下建立一个名为mytest的目录,进入mytest目录当中。(2)将/etc/man
_db.conf复制到上述目录下面,使用vim打开目录下的man_db.conf文件。(3)在vim中设定行号,移动到第58行,向右移动15个字符,请问你看到的该行前面15个字母组合是什么?(4)移动到第一行,并且向下查找“g
zip”字符串,请问它在第几行?(5)将50~100行的man字符串改为大写MAN字符串,并且逐个询问是否需要修改,如何操作?如果在筛选过程中一直按“y”键,结果会在最后一行出现改变了多少个man的说明,请回答一共替换了多少个man。(6)修改完之后,突然反悔了,要全部复原,有哪些方法?(
7)需要复制65~73这9行的内容,并且粘贴到最后一行之后。(8)删除23~28行的开头为#符号的批注数据,如何操作?(9)将这个文件另存成一个man.test.config的文件。(10)到第27行,并且删除8个字符,结果出现的第一个单词是什么?在第一行新增一行,该行内
容输入“Iamastudent...”;然后存盘后离开。132.参考步骤(1)输入mkdir/tmp/mytest;cd/tmp/mytest。(2)输入cp/etc/man_db.conf.;vimman_db.conf。(3)输入:setnu,然
后你会在画面中看到左侧出现数字即为行号。先按下“5+8+G”组合键再按下“1+5+→”组合键,会看到:#onprivileges.。(4)先执行1G或gg后,直接输入/gzip,应该是第93行。(5)直接下达“:50,100s/man/MAN/gc”即可!若一
直按“y”键最终会出现“在15行内置换26个字符串”的说明。(6)简单的方法可以一直按“u”键回复到原始状态;使用不储存离开:q!命令之后,再重新读取一次该文件也可以。(7)执行65G然后再执行9yy之后
最后一行会出现“复制9行”之类的说明字样。按下“G”键到最后一行,再按下p,则会在最后一行之后粘贴上述9行内容。(8)执行23G→6dd就能删除6行,此时你会发现光标所在23行的地方变成MANPATH
_MAP开头了,批注的#符号那几行都被删除了。(9)执行:wman.test.config,你会发现最后一行出现“man.test.config”[New]..”的字样。(10)输入27G之后,再输入8x即可删
除8个字符,出现MAP的字样;执行1G移到第一行,然后按下大写的O键,便新增一行且位于插入模式;开始输入Iamastudent...后,按下“Esc”键回到一般模式等待后续工作;最后输入:wq。147.2任务2熟练掌握shell环境变量sh
ell是用户与操作系统内核之间的接口,起着协调用户与系统的一致性和在用户与系统之间进行交互的作用。shell支持具有字符串值的变量。shell变量不需要专门的说明语句,通过赋值语句完成变量说明并予以赋值
。在命令行或shell脚本文件中使用$name的形式引用变量name的值。1.变量的定义和引用在shell中,变量的赋值格式如下:其中,name是变量名,它的值就是string,“=”是赋值符号。变量名是以字母或下画线开头的字母、数字和下画线
字符序列组成的。通过在变量名(name)前加$字符(如$name)引用变量的值,引用的结果就是用字符串string代替$name,此过程也称为变量替换。name=string15在定义变量时,若string中包含
空格、制表符和换行符,则string必须用'string'或者"string"的形式,即用单(双)引号将其括起来。双引号内允许变量替换,而单引号内则不可以。下面给出一个定义和使用shell变量的例子。//显示字符常量[root@RHEL7-1~]#echowhoar
eyouwhoareyou[root@RHEL7-1~]#echo'whoareyou'whoareyou[root@RHEL7-1~]#echo"whoareyou"whoareyou[root@RHEL7-1~]
#//由于要输出的字符串中没有特殊字符,所以''和""的效果是一样的,不用""但相当于使用了""[root@RHEL7-1~]#echoJet'aime>//由于要使用特殊字符('),//由于'不匹配,shell
认为命令行没有结束,回车后会出现系统第二提示符,//让用户继续输入命令行,按“Ctrl+C”组合键结束[root@RHEL7-1~]#//为了解决这个问题,可以使用下面的两种方法[root@RHEL7-1~]#echo"Jet'aime"Jet’aime[root@RHEL7-1~]#e
choJet\'aime162.shell变量的作用域shell变量分为局部变量和全局变量。局部变量的作用范围仅限制在其命令行所在的shell或shell脚本文件中。全局变量的作用范围则包括本sh
ell进程及其所有子进程。可以使用export内置命令将局部变量设置为全局变量。下面给出一个shell变量作用域的例子。//在当前shell中定义变量var1[root@RHEL7-1~]#var1=Linux//在当前she
ll中定义变量var2并将其输出[root@RHEL7-1~]#var2=unix[root@RHEL7-1~]#exportvar2//引用变量的值[root@RHEL7-1~]#echo$var1Linux[root@RHE
L7-1~]#echo$var2unix//显示当前shell的PID[root@RHEL7-1~]#echo$$2670[root@RHEL7-1~]#//调用子shell[root@RHEL7-1~]#bash
//显示当前shell的PID[root@RHEL7-1~]#echo$$2709//由于var1没有被输出,所以在子shell中已无值[root@RHEL7-1~]#echo$var1//由于var2被输出,所以在子shell中仍有值[root@RHEL7-1~]#echo$var
2unix//返回主shell,并显示变量的值[root@RHEL7-1~]#exit[root@RHEL7-1~]#echo$$2670[root@RHEL7-1~]#echo$var1Linux[
root@RHEL7-1~]#echo$var2unix[root@RHEL7-1~]#173.环境变量环境变量是指由shell定义和赋初值的shell变量。shell用环境变量来确定查找路径、注册目录、终端类型、终端名称、用户名等。所有环境变量
都是全局变量,并可以由用户重新设置。表7-6列出了一些系统中常用的环境变量。不同类型的shell的环境变量有不同的设置方法。在bash中,设置环境变量用set命令,命令的格式是:set环境变量=变量的值例
如,设置用户的主目录为/home/john,可以用以下命令:[root@RHEL7-1~]#setHOME=/home/john环境变量名说明环境变量名说明EDITOR、FCEDITBashfc命令的默认编辑器PATHBash寻找可执行文件的
搜索路径HISTFILE用于储存历史命令的文件PS1命令行的一级提示符HISTSIZE历史命令列表的大小PS2命令行的二级提示符HOME当前用户的用户目录PWD当前工作目录OLDPWD前一个工作目录SECONDS当前shell开始后所流逝的秒数表7-6shell中的环境变量1
8不加任何参数地直接使用set命令可以显示出用户当前所有环境变量的设置,如下所示:[root@RHEL7-1~]#setBASH=/bin/BashBASH_ENV=/root/.bashrc(略)PATH=/usr/local/s
bin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11PS1='[\u@\h\W]\$'PS2='>'SHELL=/bin/Bash其中路
径PATH的设置为:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X1119在环境变量前面加上$符号,表示引用环境变量的
值,例如:[root@RHEL7-1~]#cd$HOME上述命令将把目录切换到用户的主目录。当修改PATH变量时,例如,将一个路径/tmp加到PATH变量前,应设置为:[root@RHEL7-1~]#PATH=/tmp:$PATH要将环境变量重新设置为系统默认
值,可以使用unset命令。例如,下面的命令用于将当前的语言环境重新设置为默认的英文状态。[root@RHEL7-1~]#unsetLANG204.命令运行的判断依据:;、&&、||若想使多条命令一次输入而顺序执行,一个是通过项目9
要介绍的shellscript撰写脚本去执行,一个则是通过下面的介绍来一次输入多重命令。(1)cmd;cmd(不考虑命令相关性的连续命令执行)。一次运行多个命令,例如在关机的时候希望可以先运行两次sync同步化写入磁盘后才关机。[root@R
HEL7-1~]#sync;sync;shutdown-hnow(2)$?(命令回传值)与“&&”或“||”。在Linux中若前一个命令运行的结果正确,则在Linux中会回传一个$?=0的值。那么我们怎么通过这个回传值来判断后续的命令是否要运行
呢?这就要用到“&&”及“||”,如表7-7所示。命令执行情况说明cmd1&&cmd2若cmd1运行完毕且正确运行($?=0),则开始运行cmd2;若cmd1运行完毕且为错误($?≠0),则cmd2不运行cmd1||cmd2若cmd1运行完毕且正确
运行($?=0),则cmd2不运行;若cmd1运行完毕且为错误($?≠0),则开始运行cmd2表7-7“&&”及“||”命令的执行情况说明注意:两个&之间是没有空格的,那个“|”则是按“Shift+\”组合键的结果。21上述的cmd1及cmd2都是命令。现在回到我们刚刚假想的如下情况。先判断
一个目录是否存在。若存在,则在该目录下面创建一个文件。由于我们尚未介绍“条件判断式(test)”的使用,在这里我们使用ls以及回传值来判断目录是否存在。让我们进行下面的练习。【例7-1】使用ls查阅目录/tmp/abc是否存在,若存在,则用touch创建/tmp/
abc/hehe。[root@RHEL7-1~]#ls/tmp/abc&&touch/tmp/abc/hehels:cannotaccess/tmp/abc:Nosuchfileordirectory#说明找不到该目录,但并没有touch的错误,表示
touch并没有运行[root@RHEL7-1~]#mkdir/tmp/abc[root@RHEL7-1~]#ls/tmp/abc&&touch/tmp/abc/hehe[root@RHEL7-1~]#ll/tmp/abctotal0-rw-r--r--.1rootroot0Jul1
422:34hehe22如果/tmp/abc不存在时,touch就不会被运行;若/tmp/abc存在,那么touch就会开始运行。在上面的例子中,我们还必须手动自行创建目录,很麻烦。能不能自动判断:如果没有该目录就创建呢?看下面的例子。【例7-2】测试/tm
p/abc是否存在,若不存在,则予以创建;若存在,就不做任何事情。[root@RHEL7-1~]#rm-r/tmp/abc<==先删除此目录以方便测试[root@RHEL7-1~]#ls/tmp/abc||mkdir/tmp/
abcls:/tmp/abc:Nosuchfileordirectory<==真的不存在[root@RHEL7-1~]#ll/tmp/abcTotal0<==结果出现了,说明运行了mkdir命令如果一再重复“ls/tmp/abc||mkdir/tmp/abc”
,也不会出现重复mkdir的错误。这是因为/tmp/abc已经存在,所以后续的mkdir就不会进行。再次讨论:如果想要创建/tmp/abc/hehe这个文件,但是并不知道/tmp/abc是否存在,那该如何办呢?【例7-3】如果不
管/tmp/abc存在与否,都要创建/tmp/abc/hehe文件,怎么办呢?[root@RHEL7-1~]#ls/tmp/abc||mkdir/tmp/abc&&touch/tmp/abc/hehe23
上面的例7-3总是会创建/tmp/abc/hehe,不论/tmp/abc是否存在。那么例7-3应该如何解释呢?由于Linux下面的命令都是由左往右执行的,所以例7-3有下面两种结果。若/tmp/abc不存在。回传$?≠0;因为||遇
到非为0的$?,故开始执行mkdir/tmp/abc,由于mkdir/tmp/abc会成功执行,所以回传$?=0;因为&&遇到$?=0,故会执行touch/tmp/abc/hehe,最终hehe就被创建了。若/tmp
/abc存在。回传$?=0;因为||遇到$?=0不会执行,此时$?=0继续向后传;因为&&遇到$?=0就开始创建/tmp/abc/hehe,所以最终/tmp/abc/hehe被创建。整个流程如图7-2所示。
图7-2命令依序运行的关系示意图24上面这张图显示的两股数据中,上方的线段为不存在/tmp/abc时所进行的命令行为,下方的线段则是存在/tmp/abc时所进行的命令行为。如上所述,下方线段由于存在/tmp/abc所以导致
$?=0,中间的mkdir就不运行了,并将$?=0继续往后传给后续的touch去利用。我们再来看看下面这个例题。【例7-4】以ls测试/tmp/bobbying是否存在:若存在,则显示“exist”;若不存在,则显示“notexist”。这又牵涉到逻辑判断的问题,如果存在就显示某
个数据,若不存在就显示其他数据,那么我们可以这样做:ls/tmp/bobbying&&echo"exist"||echo"notexist"意思是说,在ls/tmp/bobbying运行后,若正确,就运行echo"exist",若有问题,就运行echo"notexist"。那如果写成如下
的方式又会如何呢?ls/tmp/bobbying||echo"notexist"&&echo"exist"25这其实是有问题的,为什么呢?由图7-2的流程介绍,我们知道命令是一个一个往后执行,因此在上面的例子中,如果/tmp/bobbying不
存在时,会进行如下动作。①若ls/tmp/bobbying不存在,则回传一个非0的数值。②接下来经过||的判断,发现前一个命令回传非0的数值,因此,程序开始运行echo"notexist",而echo"notexist"程序肯定可以运行成功,因此会回传一个0值给后面的命
令。③经过&&的判断,所以就开始运行echo"exist"。这样,在这个例子里面竟然会同时出现notexist与exist,是不是很有意思啊!请读者仔细思考。特别提示:经过这个例题的练习,你应该了解,由于命令是一个接着一个运行的,因此,如果真要使用判断,那么&&与||的顺序就不能搞错。一般来
说,假设判断式有3个,也就是,command1&&command2||command3,而且顺序通常不会变。因为一般来说,command2与command3会放置肯定可以运行成功的命令,因此,依据上面例题的逻辑分析,必须按此顺序放
置各命令,请读者一定注意。265.工作环境设置文件shell环境依赖于多个文件的设置。环境设置文件有两种,一种是系统环境设置文件,另一种是个人环境设置文件。(1)系统中的用户工作环境设置文件。登录环境设置文件:/etc/profile。
非登录环境设置文件:/etc/bashrc。(2)用户设置的环境设置文件。登录环境设置文件:$HOME/.Bash_profile。非登录环境设置文件:$HOME/.bashrc。系统中的用户环境文
件设置对所有用户均生效,而用户设置的环境设置文件对用户自身生效。用户可以修改自己的用户环境设置文件来覆盖在系统环境设置文件中的全局设置。例如,用户可以将自定义的环境变量存放在$HOME/.Bash_profile中;用户可以将自定义的别名存放在$
HOME/.bashrc中,以便在每次登录和调用子shell时生效。注意:只有在特定的情况下才读取profile文件,确切地说是在用户登录的时候读取。当运行shell脚本以后,就无须再读profile。277.3任务3熟练掌握正则表示法正则表示法就是处理
字符串的方法,它以“行”为单位来进行字符串的处理。正则表示法透过一些特殊符号的辅助,可以让使用者轻易达到查找/删除/替换某些特定字符串的工作。7.3.1子任务1掌握grep的高级使用格式:grep[-A][-B][--color=auto]'查找字符串'filename选项
与参数的含义如下。-A:后面可加数字,为after的意思,除了列出该行外,后续的n行也列出来。-B:后面可加数字,为befor的意思,除了列出该行外,前面的n行也列出来。--color=auto:可将搜寻出的正确数据用特殊颜色标记。【例7-5】用dmesg列出核心信息,再以grep找出内含IPv
6的那行。[root@RHEL7-1~]#dmesg|grep'IPv6'[20.944553]IPv6:ADDRCONF(NETDEV_UP):ens38:linkisnotready[26.822775]IPv6:ADDRCONF(NETDEV_UP):virbr0:
linkisnotready[553.276846]IPv6:ADDRCONF(NETDEV_UP):ens38:linkisnotready[553.282437]IPv6:ADDRCONF(NETDEV_U
P):ens38:linkisnotready[553.284846]IPv6:ADDRCONF(NETDEV_UP):ens38:linkisnotready[553.286861]IPv6:ADDRCON
F(NETDEV_CHANGE):ens38:linkbecomesready#dmesg可列出核心信息,通过grep获取IPv6的相关信息。不过没有行号与特殊颜色显示。28【例7-6】承上题,要将获取到的关键字
显色,且加上行号(-n)来表示。【例7-7】承上题,在关键字所在行的前一行与一行也一起找出来显示。[root@RHEL7-1~]#dmesg|grep-n--color=auto'IPv6'1903:[
20.944553]IPv6:ADDRCONF(NETDEV_UP):ens38:linkisnotready1912:[26.822775]IPv6:ADDRCONF(NETDEV_UP):virbr0:linkisnotready19
18:[553.276846]IPv6:ADDRCONF(NETDEV_UP):ens38:linkisnotready1919:[553.282437]IPv6:ADDRCONF(NETDEV_UP):ens38:linkisnotready1920:[553.28484
6]IPv6:ADDRCONF(NETDEV_UP):ens38:linkisnotready1922:[553.286861]IPv6:ADDRCONF(NETDEV_CHANGE):ens38:linkbecomesready#除了会有特殊颜色外,最前面还有行号[roo
t@RHEL7-1~]#dmesg|grep-n-A1-B1--color=auto‘IPv6’1902-[20.666378]ip_set:protocol61903:[20.944553]IPv6:ADDRCONF(NETDE
V_UP):ens38:linkisnotready……1922:[553.286861]IPv6:ADDRCONF(NETDEV_CHANGE):ens38:linkbecomesready1923-[555.495760]TCP:lpregistered#如上所示,你会发现关键字1903
所在的前一行及1922后一行也都被显示出来#这样可以让你将关键字前后数据找出来进行分析297.3.2子任务2练习基础正则表达式练习文件sample.txt的内容如下[root@RHEL7-1~]#pwd/root[root@RHE
L7-1~]#cat/root/sample.txt"OpenSource"isagoodmechanismtodevelopprograms.appleismyfavoritefood.Footballgameisnotusefeetonly.thisdre
ssdoesn'tfitme.However,thisdressisabout$3183dollars.^MGNUisfreeairnotfreebeer.^MHerhairisverybeauty.^MIcan'tfinishthet
est.^MOh!Thesouptastegood.^Mmotorcycleischeapthancar.Thiswindowisclear.thesymbol'*'isrepresentedasstart.Oh!Mygod!Thegdsoft
wareisalibraryfordraftingprograms.^MYouarethebestismeanyouaretheno.1.Theworld<Happy>isthesamewith"glad".Ilikedog.googleisthebestt
oolsforsearchkeyword.goooooogleyes!go!go!Let'sgo.#IamBobby30(1)查找特定字符串。假设我们要从文件sample.txt当中取得“the”这个特定字符串,最简单的方式是:[r
oot@RHEL7-1~]#grep-n'the'/root/sample.txt8:Ican'tfinishthetest.12:thesymbol'*'isrepresentedasstart.15:Youarethebestismeanyouaretheno.1.16:Theworld<
Happy>isthesamewith"glad".18:googleisthebesttoolsforsearchkeyword.如果想要反向选择呢,即当该行没有“the”这个字符串时才显示在屏幕上:[root@RHEL7-1
~]#grep-vn'the'/root/sample.txt如果你想要获得不论大小写的“the”这个字符串,则执行[root@RHEL7-1~]#grep-in'the'/root/sample.txt8:Ican'tfinishthetest.
9:Oh!Thesouptastegood.12:thesymbol'*'isrepresentedasstart.14:Thegdsoftwareisalibraryfordraftingprograms.15:Youaretheb
estismeanyouaretheno.1.16:Theworld<Happy>isthesamewith"glad".18:googleisthebesttoolsforsearchkeyword.31(2)利用中括号[]来搜寻
集合字符。对比“test”或“taste”这两个单词可以发现,它们有共同点“t?st”存在。这个时候,可以这样来查寻:[root@RHEL7-1~]#grep-n't[ae]st'/root/sample.txt8:Ican'tfinishthetest.9
:Oh!Thesouptastegood.其实[]里面不论有几个字符,都只代表某一个字符,所以,上面的例子说明需要的字符串是tast或test。而如果想要搜寻到有“oo”的字符时,则使用:[root@RHEL7-1~]#grep-n'oo'/root/sample
.txt1:"OpenSource"isagoodmechanismtodevelopprograms.2:appleismyfavoritefood.3:Footballgameisnotusefee
tonly.9:Oh!Thesouptastegood.18:googleisthebesttoolsforsearchkeyword.19:goooooogleyes!32如果不想要“oo”前面有“g”的行显示出来。此时,可以利用
在集合字节的反向选择[^]来完成:[root@RHEL7-1~]#grep-n'[^g]oo'/root/sample.txt2:appleismyfavoritefood.3:Footballgameisnotusefeetonly.18:googleisthebesttoolsforsearc
hkeyword.19:goooooogleyes!假设oo前面不想有小写字母,可以这样写:[^abcd....z]oo。但是这样似乎不怎么方便,由于小写字母的ASCII上编码的顺序是连续的,因此,我们可以
将之简化:[root@RHEL7-1~]#grep-n'[^a-z]oo'sample.txt3:Footballgameisnotusefeetonly.如果要求字符串是数字与英文呢?那就将其全部写在一起,变成:[a-zA-Z0-9]。例如,我们
要获取有数字的那一行:[root@RHEL7-1~]#grep-n'[0-9]'/root/sample.txt5:However,thisdressisabout$3183dollars.15:Youarethebestismeanyouarethen
o.1.33由于考虑到语系对于编码顺序的影响,所以除了连续编码使用减号“-”之外,也可以使用如下的方法来取得前面两个测试的结果:[root@RHEL7-1~]#grep-n'[^[:lower:]]oo'/root/sample
.txt#[:lower:]代表的就是a-z的意思[root@RHEL7-1~]#grep-n'[[:digit:]]'/root/sample.txt(3)行首与行尾字节^$。在前面,可以查询到一行字串里面有“the”
,那如果想要让“the”只在行首才列出呢?[root@RHEL7-1~]#grep-n'^the'/root/sample.txt12:thesymbol'*'isrepresentedasstart.34
如果想要开头是小写字母的那些行列出呢?可以这样写:[root@RHEL7-1~]#grep-n'^[a-z]'/root/sample.txt2:appleismyfavoritefood.4:thisdressdoesn'tfitme.10:mo
torcycleischeapthancar.12:thesymbol'*'isrepresentedasstart.18:googleisthebesttoolsforsearchkeyword.19:goooooogleyes!20:go!go!Let
'sgo.如果不想要开头是英文字母,则可以这样:[root@RHEL7-1~]#grep-n'^[^a-zA-Z]'/root/sample.txt1:"OpenSource"isagoodmechanismtodevelopprograms.21:#IamBobby特别提示:“^”符号
在字符集合符号(括号[])之内与之外的意义是不同的。在[]内代表“反向选择”,在[]之外则代表定位在行首。反过来思考,如果想要找出行尾结束为小数点(.)的那些行,该如何处理?35[root@RHEL7-1~]#grep-n'\.$'/roo
t/sample.txt1:"OpenSource"isagoodmechanismtodevelopprograms.2:appleismyfavoritefood.3:Footballgameisnotusefeetonly.4:t
hisdressdoesn'tfitme.10:motorcycleischeapthancar.11:Thiswindowisclear.12:thesymbol'*'isrepresentedasstart.15:Youarethebestismeanyo
uaretheno.1.16:Theworld<Happy>isthesamewith"glad".17:Ilikedog.18:googleisthebesttoolsforsearchkeyword.20:go!go!Let'sgo.特别注意:因为小数点具有其
他意义(下面会介绍),所以必须要使用跳转字节(\)来解除其特殊意义。不过,你或许会觉得奇怪,第5~9行最后面也是“.”啊。怎么无法打印出来?这里就牵涉到Windows平台的软件对于断行字符的判断问题了!我们
使用cat-A将第5行显示出来,你会发现(命令cat中的-A参数含义:显示不可打印字符,行尾显示“$”):36[root@RHEL7-1~]#cat-An/root/sample.txt|head-n10|tail-n65However,thisdressisabout$3183dollars.^
M$6GNUisfreeairnotfreebeer.^M$7Herhairisverybeauty.^M$8Ican'tfinishthetest.^M$9Oh!Thesouptastegood.^M$10motorcycleischeapthancar.$由此,可以发现第5~9
行为Windows的断行字节(^M$),而正常的Linux应该仅有第10行显示的那样($)。所以,也就找不到5~9行了。这样就可以了解“^”与“$”的意义了。如果想要找出哪一行是空白行,即该行没有输入任何数据,该如何搜寻?[root@RHEL7-1~]#grep-n'^$'/root/samp
le.txt22:37技巧:假设已经知道在一个程序脚本(shellscript)或者是配置文件中,空白行与开头为#的那些行是注解,因此如果你要将数据打印出参考时,可以将这些数据省略掉以节省纸张,那么怎么操作呢?我们以
/etc/rsyslog.conf这个文件来作范例,可以自行参考以下输出的结果(-v选项表示输出除之外的所有行):[root@RHEL7-1~]#cat-n/etc/rsyslog.conf#结果可以发现有91行的输出,其中包含很多空白行与#
开头的注释行[root@RHEL7-1~]#grep-v'^$'/etc/rsyslog.conf|grep-v'^#'#结果仅有10行,其中第一个“-v'^$'”代表不要空白行#第二个“-v'^#'”代表不要开头是#的那行38(4)任意一个字符“.”与重复字节“*”。万用字
符“*”可以用来代表任意(0或多个)字符,但是正则表示法并不是万用字符,两者之间是不相同的。至于正则表示法当中的“.”则代表“绝对有一个任意字符”的意思。这两个符号在正则表示法的意义如下。.(小数点):代表一个任意字
符。*(星号):代表重复前一个字符0次到无穷多次的意思,为组合形态。假设需要找出“g??d”的字符串,即共有4个字符,开头是“g”而结束是“d”,可以这样做:[root@RHEL7-1~]#grep-n'g..d'/root/sample.txt1:"OpenSource"is
agoodmechanismtodevelopprograms.9:Oh!Thesouptastegood.16:Theworld<Happy>isthesamewith"glad".因为强调g与d之间一定要存在两个
字符,因此,第13行的god与第14行的gd就不会被列出来。如果想要列出oo、ooo、oooo等数据,也就是说,至少要有两个(含)o以上,该如何操作呢?是o*还是oo*还是ooo*呢?因为*代表的是“重复0个或多个前面的RE字符
”,因此,“o*”代表的是“拥有空字符或一个o以上的字符”。特别注意:因为允许空字符(即有没有字符都可以),所以“grep-n'o*'sample.txt”将会把所有的数据都列出来。39那如果是“oo*”呢?则第一个o肯定必须要存在,第二个o则是可有
可无的多个o,所以,凡是含有o、oo、ooo、oooo等,都可以被列出来。同理,当需要“至少两个o以上的字符串”时,就需要ooo*,即[root@RHEL7-1~]#grep-n'ooo*'/root/sample.txt1:"OpenSource"isagoodmechanismtodeve
lopprograms.2:appleismyfavoritefood.3:Footballgameisnotusefeetonly.9:Oh!Thesouptastegood.18:googleisthebesttoolsforsearchkeyword.19:go
ooooogleyes!如果想要字符串开头与结尾都是g,但是两个g之间仅能存在至少一个o,即gog、goog、gooog等,那该如何操作呢?[root@RHEL7-1~]#grep-n'goo*g'sample.txt18:googleisthebesttoolsfo
rsearchkeyword.19:goooooogleyes!40要找出以g开头且以g结尾的字符串,利用任意一个字符“.”,即“g.*g”。因为“*”可以是0个或多个重复前面的字符,而“.”是任意字节,所以“.*”就代表零个或多个任意字符。[root@RHEL7-1~]#grep
-n'g.*g'/root/sample.txt1:"OpenSource"isagoodmechanismtodevelopprograms.14:Thegdsoftwareisalibraryfordraftingprograms.18:googlei
sthebesttoolsforsearchkeyword.19:goooooogleyes!20:go!go!Let'sgo.如果想要找出“任意数字”的行列呢?因为仅有数字,所以这样做:[root@RHEL7-
1~]#grep-n'[0-9][0-9]*'/root/sample.txt5:However,thisdressisabout$3183dollars.15:Youarethebestismeanyouaret
heno.1.41(5)限定连续RE字符范围{}。如果想要限制一个范围区间内的重复字符数该怎么办呢?举例来说,想要找出2个~5个o的连续字符串,该如何操作?这时候就要使用限定范围的字符{}了。但因为“{”与“}”的符号在shell里是有特殊意义的,所以必须使用转
义字符“\”来让其失去特殊意义才行。先来做一个练习,假设要找到含两个o的字符串的行,可以这样做:[root@RHEL7-1~]#grep-n'o\{2\}'/root/sample.txt1:"OpenSource"isagoodmechanism
todevelopprograms.2:appleismyfavoritefood.3:Footballgameisnotusefeetonly.9:Oh!Thesouptastegood.18:googleisthebesttoolsforsearchke
yword.19:goooooogleyes!似乎与ooo*的字符没有什么差异,因为第19行有多个o依旧也出现了!那么换个搜寻的字符串试试。假设要找出g后面接2~5个o,然后再接一个g的字符串,应该这样操作:[root@RHEL7-1~]#grep-n'go\{2,5\}g'/root/sam
ple.txt18:googleisthebesttoolsforsearchkeyword.第19行没有被选中(因为19行有6个o)。那么,如果想要的是2个o以上的goooo....g呢?除了可以使用gooo*g外,也可以
这样:[root@RHEL7-1~]#grep-n'go\{2,\}g'/root/sample.txt18:googleisthebesttoolsforsearchkeyword.19:goooooogleyes!4
27.3.3子任务3基础正则表达式的特殊字符汇总RE字符意义与范例^word意义:待搜寻的字串(word)在行首范例:搜寻行首为#开始的那一行,并列出行号grep-n'^#'sample.txtword$意义:待搜寻的字串“word”在行尾范例:将行尾为!的那一
行列出来,并列出行号grep-n'!$'sample.txt.意义:代表一定有一个任意字节的字符范例:搜寻的字串可以是“eve”“eae”“eee”“ee”,但不能仅有“ee”,即e与e中间“一定”仅有一个字符,而空白字符也是字
符grep-n'e.e'sample.txt\意义:转义字符,将特殊符号的特殊意义去除范例:搜寻含有单引号'的那一行!grep–n\'sample.txt*意义:重复零个到无穷多个的前一个RE字符范例:找出含有“es”“ess”“esss”等的字串,
注意,因为*可以是0个,所以es也是符合要求的搜寻字符串。另外,因为*为重复“前一个RE字符”的符号,因此,在*之前必须要紧接着一个RE字符!例如任意字符则为“.*”grep-n'ess*'sample.txt[list]意义:字节集合的RE字符,里面列出想要
选取的字节范例:搜寻含有(gl)或(gd)的那一行,需要特别留意的是,在[]当中“仅代表一个待搜寻的字符”,例如“a[afl]y”代表搜寻的字符串可以是aay、afy、aly即[afl]代表a或f或l的意思gr
ep-n'g[ld]'sample.txt[n1-n2]意义:字符集合的RE字符,里面列出想要选取的字符范围!范例:搜寻含有任意数字的那一行!需特别留意,在字符集合[]中的减号-是有特殊意义的,代表两个字符之间的所有连续字符!但这个连续与否与ASCII编
码有关,因此,你的编码需要设置正确(在bash当中,需要确定LANG与LANGUAGE的变量是否正确!),例如所有大写字符则为[A-Z]grep-n'[A-Z]'sample.txt[^list]意义:字符集合的RE字符,里面列出不需要的字符串或范围范例
:搜寻的字符串可以是“oog”“ood”,但不能是“oot”,那个^在[]内时,代表的意义是“反向选择”的意思。例如,不选取大写字符,则为[^A-Z]。但是,需要特别注意的是,如果以grep-n[^A
-Z]sample.txt来搜寻,则发现该文件内的所有行都被列出,为什么?因为这个[^A-Z]是“非大写字符”的意思,因为每一行均有非大写字符grep-n'oo[^t]'sample.txt\{n,m\}意义:连续n~m个的“前一个RE字符”意义:若为\{n\}则是连续n个的前一
个RE字符意义:若是\{n,\}则是连续n个以上的前一个RE字符范例:在g与g之间有2~3个的o存在的字符串,即“goog”、“gooog”437.4任务4掌握输入输出重定向与管道命令的应用7.4.1子任务1使用重定向重定向就是不使用系统的标准输入端口、标准输出端口或标准错误端口,而进行重
新的指定,所以重定向分为输入重定向、输出重定向和错误重定向。通常情况下,重定向到一个文件。在shell中,要实现重定向主要依靠重定向符,即shell是检查命令行中有无重定向符来决定是否需要实施重定向。表7-9列出了常用的重定向符。重定向符说明<实现
输入重定向。输入重定向并不经常使用,因为大多数命令都以参数的形式在命令行上指定输入文件的文件名。尽管如此,当使用一个不接受文件名为输入多数的命令,而需要的输入又是在一个已存在的文件中时,就能用输入重定向解决问题>或>>
实现输出重定向。输出重定向比输入重定向更常用。输出重定向使用户能把一个命令的输出重定向到一个文件中,而不是显示在屏幕上。很多情况下都可以使用这种功能。例如,如果某个命令的输出很多,在屏幕上不能完全显示,即可把它重定向到一个文件中,稍后再用文本编辑器来打开这个文件2>或2>>实现错误重定向&>
同时实现输出重定向和错误重定向表7-9重定向符44下面举几个使用重定向的例子。(1)将ls命令生成的/tmp目录的一个清单存到当前目录中的dir文件中。[root@RHEL7-1~]#ls-l/tmp>dir(2)将ls命令生成的/etc目录的
一个清单以追加的方式存到当前目录中的dir文件中。[root@RHEL7-1~]#ls-l/etc>>dir(3)passwd文件的内容作为wc命令的输入(wc命令用来计算数字,可以计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标
准输入设备读取数据)。[root@RHEL7-1~]#wc</etc/passwd(4)将命令myprogram的错误信息保存在当前目录下的err_file文件中。[root@RHEL7-1~]#myprogram2>err_file45(5)将命令myprogram的输出信
息和错误信息保存在当前目录下的output_file文件中。[root@RHEL7-1~]#myprogram&>output_file(6)将命令ls的错误信息保存在当前目录下的err_file文件中。[
root@RHEL7-1~]#ls-l2>err_file注意:该命令并没有产生错误信息,但err_file文件中的原文件内容会被清空。当我们输入重定向符时,命令解释程序会检查目标文件是否存在。如果不存在,命令解释程序将会根据给定的文件名创建一个空文件;如果文件已经存
在,命令解释程序则会清除其内容并准备写入命令的输出到结果。这种操作方式表明:当重定向到一个已存在的文件时需要十分小心,数据很容易在用户还没有意识到之前就丢失了。Bash输入输出重定向可以通过使用下面选项设置为不覆盖已存在文件:[root@RHEL7-1~]#set-onoclob
ber46(7)/dev/null。空设备的一个典型用法是丢弃从find或grep等命令送来的错误信息:[root@RHEL7-1~]#grepdelegate/etc/*2>/dev/null上面的grep命令的含义是从/etc目录下的所有文件中搜索包含字符
串delegate的所有行。由于我们是在普通用户的权限下执行该命令,grep命令是无法打开某些文件的,系统会显示一大堆“未得到允许”的错误提示。通过将错误重定向到空设备,我们可以在屏幕上只得到有用的输出。477.4.2子任务2使用管道许多Linux命令具有过滤
特性,即一条命令通过标准输入端口接收一个文件中的数据,命令执行后产生的结果数据又通过标准输出端口送给后一条命令,作为该命令的输入数据。后一条命令也是通过标准输入端口接收输入数据。shell提供管道命令“|”将这些命令前后衔接在一起,形成一个管道线。格式为命令1|命令2|...|命令n
管道线中的每一条命令都作为一个单独的进程运行,每一条命令的输出作为下一条命令的输入。由于管道线中的命令总是从左到右顺序执行的,所以管道线是单向的。管道线的实现创建了Linux系统管道文件并进行重定向,但是管道不同于I/O重定向,输入重定向导致
一个程序的标准输入来自某个文件,输出重定向是将一个程序的标准输出写到一个文件中,而管道是直接将一个程序的标准输出与另一个程序的标准输入相连接,不需要经过任何中间文件。例如:[root@RHEL7-1~]#who>tmpfile48我们运行命令
who来找出谁已经登录进入系统。该命令的输出结果是每个用户对应一行数据,其中包含了一些有用的信息,我们将这些信息保存在临时文件中。现在我们运行下面的命令:[root@RHEL7-1~]#wc-l<tmpfile该命令会统计临时文件的行数,最后的结果是登录进入系统中的用户的人数。我们可以
将以上两个命令组合起来。[root@RHEL7-1~]#who|wc-l管道符号告诉命令解释程序将左边的命令(在本例中为who)的标准输出流连接到右边的命令(在本例中为wc-l)的标准输入流。现在命令who的输出不经过临时文件就可以直接送到命
令wc中了。49管道仅能操纵命令的标准输出流。如果标准错误输出未重定向,那么任何写入其中的信息都会在终端显示屏幕上显示。管道可用来连接两个以上的命令。由于使用了一种被称为过滤器的服务程序,所以多级管道在
Linux中是很普遍的。过滤器只是一段程序,它从自己的标准输入流读入数据,然后写到自己的标准输出流中,这样就能沿着管道过滤数据。在下例中:[root@RHEL7-1~]#who|greproot|wc-lwho
命令的输出结果由grep命令来处理,而grep命令则过滤掉(丢弃掉)所有不包含字符串“root”的行。这个输出结果经过管道送到命令wc,而该命令的功能是统计剩余的行数,这些行数与网络用户的人数相对应。Linux系统的一个最大的
优势就是按照这种方式将一些简单的命令连接起来,形成更复杂的、功能更强的命令。那些标准的服务程序仅仅是一些管道应用的单元模块,在管道中它们的作用更加明显。507.5项目实录使用vim编辑器1.视频位置实训前请扫二维码,观看“实训项目使用vim编辑器”慕课。2.项目实训目的掌握
vim编辑器的启动与退出的方法。掌握vim编辑器的3种模式及使用方法。熟悉C/C++编译器gcc的使用方法。3.项目背景在Linux操作系统中设计一个C语言程序,当程序运行时显示图7-3所示的运行效果。4.项目实训内容练习vim编辑器的
启动与退出,练习vim编辑器的使用方法,练习C/C++编译器gcc的使用。5.做一做根据项目实录视频进行项目的实训,检查学习效果。实训项目使用vim编辑器图7-3C语言程序