1、项目七 熟练使用vim程序编辑器与shell2项目导入学会使用vim编辑器。了解shell的强大功能和shell的命令解释过程。学会使用重定向和管道的方法。掌握正则表达式的使用方法。职业能力目标和要求 系统管理员的一项重要工作就是要修改与设定某些重要软件的配置文件,因此系统管理员至少要学会使用一种以上的文字接口的文本编辑器。所有的Linux发行版本都内置有vi文本编辑器,很多软件也默认使用vi作为编辑的接口,vim是进阶版的vi,因此读者一定要学会使用vi文本编辑器。vim不但可以用不同颜色显示文本内容,还能够进行诸如shell script、C program等程序的编辑,因此,可以将vim
2、视为一种程序编辑器。项目七 熟练使用vim程序编辑器与shell37.1 熟练使用vim程序编辑器7.2 熟练掌握shell环境变量7.3 熟练掌握正则表示法7.4 掌握输入输出重定向与管道命令的应用7.5 项目实录47.1 任务1 熟练使用vim编辑器 vim是vimsual interface的简称,它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制。这是其他编辑程序所没有的。vim不是一个排版程序,它不像Word或WPS那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。vim是全屏幕文本编辑器,没有菜单,只有命令。vi编辑器
3、的使用7.1.1 子任务1 启动和退出vim 在系统提示符后输入vim和想要编辑(或建立)的文件名,便可进入vim,如:rootRHEL7-1#vim myfile5如果只输入vim,而不带文件名,也可以进入vim,如图7-1所示。图7-1 vim编辑环境 在编辑模式下(初次进入vim不做任何操作就是编辑模式)键入:q,:q!,:wq或:x(注意:号),就会退出vim。其中:wq和:x是存盘退出,而:q是直接退出。如果文件已有新的变化,可以用:w命令保存文件后再用:q退出,或用:wq或:x命令退出。如果你不想保存改变后的文件,就需要用:q!命令。这个命令将不保存文件而直接退出vim,例如::w
4、 保存:w filename 另存为filename:wq!保存退出:wq!filename 注:以filename为文件名保存后退出:q!不保存退出:x 应该是保存并退出,功能和:wq!相同67.1.2 子任务2 熟练掌握vim的工作模式vim有3种基本工作模式:编辑模式、插入模式和命令模式。1编辑模式 进入vim之后,首先进入的就是编辑模式。进入编辑模式后,vim等待编辑命令输入而不是文本输入。进入编辑模式后光标停在屏幕第一行首位,用_表示,其余各行的行首均有一个“”符号,表示该行为空行。最后一行是状态行,显示出当前正在编辑的文件名及其状态。如果是New File,则表示该文件是一个新建的
5、文件;如果输入vim带文件名后,文件已在系统中存在,则在屏幕上显示出该文件的内容,并且光标停在第一行的首位,在状态行显示出该文件的文件名、行数和字符数。2插入模式 在编辑模式下按下相应的键可以进入插入模式:插入命令i、附加命令a、打开命令o、修改命令c、取代命令r或替换命令s都可以进入插入模式。在插入模式下,用户输入的任何字符都被vim当作文件内容保存起来,并将其显示在屏幕上。在文本输入过程中(插入模式下),若想回到编辑模式下,按“Esc”键即可。73命令模式在编辑模式下,用户按“:”键即可进入命令模式。此时vim会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”作为命令模式的提示
6、符,等待用户输入命令。多数文件管理命令都是在此模式下执行的。末行命令执行完后,vim自动回到编辑模式。若在命令模式下输入命令的过程中改变了主意,可在用退格键将输入的命令全部删除之后,再按一下退格键,即可使vim回到编辑模式。87.1.3 子任务3 使用vim命令1在编辑模式下的命令说明在编辑模式下,光标移动、查找与替换、复制粘贴等的说明分别如表7-1、表7-2和表7-3所示。移动光标的方法移动光标的方法h或向左箭头键(或向左箭头键()光标向左移动一个字符或向下箭头键(或向下箭头键()光标向下移动一个字符k或向上箭头键(或向上箭头键()光标向上移动一个字符l或向右箭头键(或向右箭头键()光标向右
7、移动一个字符Ctrl+f屏幕向下移动一页,相当于“Page Down”键(常用)Ctrl+b屏幕向上移动一页,相当于“Page Up”键(常用)Ctrl+d屏幕向下移动半页Ctrl+u屏幕向上移动半页+光标移动到非空格符的下一列-光标移动到非空格符的上一列nn表示数字,例如20。按下数字后再按空格键,光标会向右移动这一行的n个字符。例如输入20 则光标会向后面移动20个字符距离0或功能键或功能键“Home”这是数字0:移动到这一行的最前面字符处(常用)$或功能键或功能键“End”移动到这一行的最后面字符处(常用)H光标移动到这个屏幕的最上方那一行的第一个字符M光标移动到这个屏幕的中央那一行的第
8、一个字符L光标移动到这个屏幕的最下方那一行的第一个字符G移动到这个文件的最后一行(常用)nGn为数字。移动到这个文件的第n行。例如输入20G则会移动到这个文件的第20行(可配合:set nu)gg移动到这个文件的第一行,相当于1G(常用)nn为数字。光标向下移动n行(常用)查找与替换查找与替换/word向光标之下寻找一个名称为word的字符串。例如要在文件内查找myweb这个字符串,就输入/myweb即可(常用)?word向光标之上寻找一个名称为word的字符串n这个n是英文按键。代表重复前一个查找的动作。举例来说,如果刚刚我们执行/myweb去向下查找myweb这个字符串,则按下n后,会向下
9、继续查找下一个名称为myweb的字符串。如果是执行?myweb,那么按下n则会向上继续查找名称为myweb的字符串N这个N是英文按键。与n刚好相反,为反向进行前一个查找动作。例如执行/myweb后,按下N则表示向上查找myweb使用使用/word配合配合n及及N是非常有帮助的!可以让你重复地找到一些查找的关键词是非常有帮助的!可以让你重复地找到一些查找的关键词:n1,n2 s/word1/word2/gn1与n2为数字。在第n1n2行寻找word1这个字符串,并将该字符串取代为word2!举例来说,在100200行查找myweb并取代为MYWEB则输入“:100,200s/myweb/MYWE
10、B/g”(常用):1,$s/word1/word2/g从第一行到最后一行寻找word字符串,并将该字符串取代为word2(常用):1,$s/word1/word2/gc从第一行到最后一行寻找word1字符串,并将该字符串取代为word2!且在取代前显示提示字符给用户确认(confirm)是否需要取代(常用)表7-1 编辑模式下的光标移动的说明表7-2 编辑模式下的查找与替换的说明9删除、复制与粘贴删除、复制与粘贴x,X在一行字当中,x为向后删除一个字符(相当于“Del”键),X为向前删除一个字符(相当于Backspace,退格键)(常用)nxn为数字,连续向后删除n个字符。举例来说,要连续删除
11、10个字符,输入10 xdd删除光标所在的那一整列(常用)nddn为数字。删除光标所在的向下n列,例如,20dd是删除20列(常用)d1G删除光标所在到第一行的所有数据dG删除光标所在到最后一行的所有数据d$删除光标所在处,到该行的最后一个字符d0那个是数字0,删除光标所在行的前一字符到该行的首个字符之间的所有字符yy复制光标所在的那一行(常用)nyyn为数字。复制光标所在的向下n列,例如20yy是复制20列(常用)y1G复制光标所在列到第一列的所有数据yG复制光标所在列到最后一列的所有数据y0复制光标所在的那个字符到该行行首的所有数据表7-3 编辑模式下删除、复制与粘贴的说明y$复制光标所在
12、的那个字符到该行行尾的所有数据p,Pp为将已复制的数据在光标下一行粘贴上,P则为粘贴在光标上一行!举例来说,目前光标在第20行,且已经复制了10行数据,则按下p后,那10行数据会粘贴在原来的20行之后,即由21行开始粘贴。但如果是按下P呢?将会在光标之前粘贴,即原本的第20行会变成第30行(常用)J将光标所在列与下一列的数据结合成同一列c重复删除多个数据,例如向下删除10行,输入10cju复原前一个动作(常用)Ctrl+r重做上一个动作(常用).不要怀疑!这就是小数点!意思是重复前一个动作的意思。如果你想要重复删除、重复粘贴等动作,按下小数点就可以(常用)102进入插入模式的命令说明编辑模式切
13、换到插入模式的可用的按键的相关说明如表7-4所示。类类 型型命命 令令说说 明明进入插入模式进入插入模式i从光标所在位置前开始插入文本从光标所在位置前开始插入文本I该命令是将光标移到当前行的行首,然后插入文本该命令是将光标移到当前行的行首,然后插入文本类类 型型命命 令令说说 明明进入插入模式进入插入模式a用于在光标当前所在位置之后追加新文本用于在光标当前所在位置之后追加新文本A将光标移到所在行的行尾,从那里开始插入新文本将光标移到所在行的行尾,从那里开始插入新文本o在光标所在行的下面新开一行,并将光标置于该行行首,等待输入在光标所在行的下面新开一行,并将光标置于该行行首,等待输入O在光标所在
14、行的上面插入一行,并将光标置于该行行首,等待输入在光标所在行的上面插入一行,并将光标置于该行行首,等待输入Esc退出编辑模式或回到编辑模式中(常用)退出编辑模式或回到编辑模式中(常用)表7-4 进入插入模式的说明说明:上面这些按键中,在vim画面的左下角处会出现“-INSERT-”或“-REPLACE-”的字样。由名称就知道该动作了。需要特别注意的是,我们上面也提过了,想要在文件里面输入字符,一定要在左下角处看到INSERT或REPLACE才能输入。113命令模式的按键说明如果是插入模式,先按“Esc”键进入编辑模式。在编辑模式下按“:”进入命令模式。保存文件、退出编辑等的命令按键如表7-5所
15、示。:w将编辑的数据写入硬盘文件中(常用)将编辑的数据写入硬盘文件中(常用):w!若文件属性为只读时,强制写入该档案。不过,到底能不能写入,还与你对该文件拥有的权限有关:q退出vim(常用):q!若曾修改过文件,又不想储存,则使用“!”强制退出而不储存文件。注意一下,惊叹号(!)在vim当中,常常具有强制的意思:wq储存后离开,若为“:wq!”,则为强制储存后离开(常用)ZZ这是大写的Z。若文件没有更改,则不储存离开;若文件已经被更动过,则储存后离开:w filename将编辑的数据储存成另一个文件(类似另存为新文件):r filename在编辑的数据中,读入另一个文件的数据,即将filena
16、me这个文件内容加到光标所在行的后面:n1,n2 w filename将n1到n2的内容储存成filename这个文件:!command暂时退出vim到命令列模式下执行command的显示结果。例如,“:!ls/home”即可在vim当中察看/home底下以ls输出的文件信息:set nu显示行号,设定之后,会在每一行的前缀显示该行的行号:set nonu与:set nu相反,为取消行号表7-5 命令模式的按键说明127.1.4 子任务4 完成案例练习1本次案例练习的要求(RHEL 7-2上实现)(1)在/tmp目录下建立一个名为mytest的目录,进入mytest目录当中。(2)将/etc/
17、man_db.conf复制到上述目录下面,使用vim打开目录下的man_db.conf文件。(3)在vim中设定行号,移动到第58行,向右移动15个字符,请问你看到的该行前面15个字母组合是什么?(4)移动到第一行,并且向下查找“gzip”字符串,请问它在第几行?(5)将50100行的man字符串改为大写MAN字符串,并且逐个询问是否需要修改,如何操作?如果在筛选过程中一直按“y”键,结果会在最后一行出现改变了多少个man的说明,请回答一共替换了多少个man。(6)修改完之后,突然反悔了,要全部复原,有哪些方法?(7)需要复制6573这9行的内容,并且粘贴到最后一行之后。(8)删除2328行的
18、开头为#符号的批注数据,如何操作?(9)将这个文件另存成一个man.test.config的文件。(10)到第27行,并且删除8个字符,结果出现的第一个单词是什么?在第一行新增一行,该行内容输入“I am a student.”;然后存盘后离开。132参考步骤(1)输入mkdir /tmp/mytest;cd /tmp/mytest。(2)输入cp /etc/man_db.conf .;vim man_db.conf。(3)输入:set nu,然后你会在画面中看到左侧出现数字即为行号。先按下“5+8+G”组合键再按下“1+5+”组合键,会看到:#on privileges.。(4)先执行1G或
19、gg后,直接输入/gzip,应该是第93行。(5)直接下达“:50,100 s/man/MAN/gc”即可!若一直按“y”键最终会出现“在15行内置换26个字符串”的说明。(6)简单的方法可以一直按“u”键回复到原始状态;使用不储存离开:q!命令之后,再重新读取一次该文件也可以。(7)执行65G然后再执行9yy之后最后一行会出现“复制9行”之类的说明字样。按下“G”键到最后一行,再按下p,则会在最后一行之后粘贴上述9行内容。(8)执行23G6dd就能删除6行,此时你会发现光标所在23行的地方变成MANPATH_ MAP开头了,批注的#符号那几行都被删除了。(9)执行:w man.test.co
20、nfig,你会发现最后一行出现“man.test.config”New.”的字样。(10)输入27G之后,再输入8x即可删除8个字符,出现MAP的字样;执行1G移到第一行,然后按下大写的O键,便新增一行且位于插入模式;开始输入I am a student.后,按下“Esc”键回到一般模式等待后续工作;最后输入:wq。147.2 任务2 熟练掌握shell环境变量 shell是用户与操作系统内核之间的接口,起着协调用户与系统的一致性和在用户与系统之间进行交互的作用。shell支持具有字符串值的变量。shell变量不需要专门的说明语句,通过赋值语句完成变量说明并予以赋值。在命令行或shell脚本文
21、件中使用$name的形式引用变量name的值。1.变量的定义和引用在shell中,变量的赋值格式如下:其中,name是变量名,它的值就是string,“=”是赋值符号。变量名是以字母或下画线开头的字母、数字和下画线字符序列组成的。通过在变量名(name)前加$字符(如$name)引用变量的值,引用的结果就是用字符串string代替$name,此过程也称为变量替换。name=string15 在定义变量时,若string中包含空格、制表符和换行符,则string必须用 string 或者 string的形式,即用单(双)引号将其括起来。双引号内允许变量替换,而单引号内则不可以。下面给出一个定义和
22、使用shell变量的例子。/显示字符常量rootRHEL7-1#echo who are youwho are yourootRHEL7-1#echo who are you who are yourootRHEL7-1#echo who are youwho are yourootRHEL7-1#/由于要输出的字符串中没有特殊字符,所以 和 的效果是一样的,不用但相当于使用了rootRHEL7-1#echo Je taime/由于要使用特殊字符(),/由于不匹配,shell认为命令行没有结束,回车后会出现系统第二提示符,/让用户继续输入命令行,按“Ctrl+C”组合键结束rootRHEL7-
23、1#/为了解决这个问题,可以使用下面的两种方法rootRHEL7-1#echo Je taimeJe taimerootRHEL7-1#echo Je taime162shell变量的作用域shell变量分为局部变量和全局变量。局部变量的作用范围仅限制在其命令行所在的shell或shell脚本文件中。全局变量的作用范围则包括本shell进程及其所有子进程。可以使用export内置命令将局部变量设置为全局变量。下面给出一个shell变量作用域的例子。/在当前shell中定义变量var1rootRHEL7-1#var1=Linux/在当前shell中定义变量var2并将其输出rootRHEL7-1
24、#var2=unixrootRHEL7-1#export var2/引用变量的值rootRHEL7-1#echo$var1LinuxrootRHEL7-1#echo$var2unix/显示当前shell的PIDrootRHEL7-1#echo$2670rootRHEL7-1#/调用子shellrootRHEL7-1#bash/显示当前shell的PIDrootRHEL7-1#echo$2709 /由于var1没有被输出,所以在子shell中已无值rootRHEL7-1#echo$var1/由于var2被输出,所以在子shell中仍有值rootRHEL7-1#echo$var2unix/返回主s
25、hell,并显示变量的值rootRHEL7-1#exitrootRHEL7-1#echo$2670rootRHEL7-1#echo$var1LinuxrootRHEL7-1#echo$var2unixrootRHEL7-1#173环境变量 环境变量是指由shell定义和赋初值的shell变量。shell用环境变量来确定查找路径、注册目录、终端类型、终端名称、用户名等。所有环境变量都是全局变量,并可以由用户重新设置。表7-6列出了一些系统中常用的环境变量。不同类型的shell的环境变量有不同的设置方法。在bash中,设置环境变量用set命令,命令的格式是:set环境变量=变量的值例如,设置用户的
26、主目录为/home/john,可以用以下命令:rootRHEL7-1#set HOME=/home/john环境变量名环境变量名说说 明明环境变量名环境变量名说说 明明EDITOR、FCEDITBash fc命令的默认编辑器PATHBash寻找可执行文件的搜索路径寻找可执行文件的搜索路径HISTFILE用于储存历史命令的文件PS1命令行的一级提示符命令行的一级提示符HISTSIZE历史命令列表的大小PS2命令行的二级提示符命令行的二级提示符HOME当前用户的用户目录PWD当前工作目录当前工作目录OLDPWD前一个工作目录前一个工作目录SECONDS当前当前shell开始后所流逝的秒数开始后所流
27、逝的秒数表7-6 shell中的环境变量18不加任何参数地直接使用set命令可以显示出用户当前所有环境变量的设置,如下所示:rootRHEL7-1#set BASH=/bin/BashBASH_ENV=/root/.bashrc(略)PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11PS1=uh W$PS2=SHELL=/bin/Bash其中路径PATH的设置为:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bi
28、n:/usr/bin/X1119在环境变量前面加上$符号,表示引用环境变量的值,例如:rootRHEL7-1#cd$HOME上述命令将把目录切换到用户的主目录。当修改PATH变量时,例如,将一个路径/tmp加到PATH变量前,应设置为:rootRHEL7-1#PATH=/tmp:$PATH 要将环境变量重新设置为系统默认值,可以使用unset命令。例如,下面的命令用于将当前的语言环境重新设置为默认的英文状态。rootRHEL7-1#unset LANG204命令运行的判断依据:;、&、|若想使多条命令一次输入而顺序执行,一个是通过项目9要介绍的shell script撰写脚本去执行,一个则是通
29、过下面的介绍来一次输入多重命令。(1)cmd;cmd(不考虑命令相关性的连续命令执行)。一次运行多个命令,例如在关机的时候希望可以先运行两次sync同步化写入磁盘后才关机。rootRHEL7-1#sync;sync;shutdown-h now(2)$?(命令回传值)与“&”或“|”。在Linux中若前一个命令运行的结果正确,则在Linux中会回传一个$?=0的值。那么我们怎么通过这个回传值来判断后续的命令是否要运行呢?这就要用到“&”及“|”,如表7-7所示。命令执行情况命令执行情况说说 明明cmd1&cmd2若cmd1运行完毕且正确运行($?=0),则开始运行cmd2;若cmd1运行完毕且
30、为错误($?0),则cmd2不运行cmd1|cmd2若cmd1运行完毕且正确运行($?=0),则cmd2不运行;若cmd1运行完毕且为错误($?0),则开始运行cmd2表7-7 “&”及“|”命令的执行情况说明注意:两个&之间是没有空格的,那个“|”则是按“Shift+”组合键的结果。21 上述的cmd1及cmd2都是命令。现在回到我们刚刚假想的如下情况。先判断一个目录是否存在。若存在,则在该目录下面创建一个文件。由于我们尚未介绍“条件判断式(test)”的使用,在这里我们使用ls以及回传值来判断目录是否存在。让我们进行下面的练习。【例7-1】使用ls查阅目录/tmp/abc是否存在,若存在,
31、则用touch创建/tmp/abc/hehe。rootRHEL7-1#ls/tmp/abc&touch/tmp/abc/hehels:cannot access/tmp/abc:No such file or directory#说明找不到该目录,但并没有touch的错误,表示touch并没有运行rootRHEL7-1#mkdir /tmp/abcrootRHEL7-1#ls /tmp/abc&touch /tmp/abc/heherootRHEL7-1#ll /tmp/abctotal 0-rw-r-r-.1 root root 0 Jul 14 22:34 hehe22 如果/tmp/ab
32、c不存在时,touch就不会被运行;若/tmp/abc存在,那么touch就会开始运行。在上面的例子中,我们还必须手动自行创建目录,很麻烦。能不能自动判断:如果没有该目录就创建呢?看下面的例子。【例7-2】测试/tmp/abc是否存在,若不存在,则予以创建;若存在,就不做任何事情。rootRHEL7-1#rm -r /tmp/abc =先删除此目录以方便测试rootRHEL7-1#ls /tmp/abc|mkdir /tmp/abcls:/tmp/abc:No such file or directory=真的不存在rootRHEL7-1#ll /tmp/abcTotal 0 =结果出现了,说
33、明运行了mkdir命令 如果一再重复“ls /tmp/abc|mkdir /tmp/abc”,也不会出现重复mkdir的错误。这是因为/tmp/abc已经存在,所以后续的mkdir就不会进行。再次讨论:如果想要创建/tmp/abc/hehe这个文件,但是并不知道/tmp/abc是否存在,那该如何办呢?【例7-3】如果不管/tmp/abc存在与否,都要创建/tmp/abc/hehe文件,怎么办呢?rootRHEL7-1#ls/tmp/abc|mkdir /tmp/abc&touch /tmp/abc/hehe23 上面的例7-3总是会创建/tmp/abc/hehe,不论/tmp/abc是否存在。
34、那么例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
35、 上面这张图显示的两股数据中,上方的线段为不存在/tmp/abc时所进行的命令行为,下方的线段则是存在/tmp/abc时所进行的命令行为。如上所述,下方线段由于存在/tmp/abc所以导致$?=0,中间的mkdir就不运行了,并将$?=0继续往后传给后续的touch去利用。我们再来看看下面这个例题。【例7-4】以ls测试/tmp/bobbying是否存在:若存在,则显示“exist”;若不存在,则显示“not exist”。这又牵涉到逻辑判断的问题,如果存在就显示某个数据,若不存在就显示其他数据,那么我们可以这样做:ls /tmp/bobbying&echo exist|echo not ex
36、ist 意思是说,在ls /tmp/bobbying运行后,若正确,就运行echo exist,若有问题,就运行echo not exist。那如果写成如下的方式又会如何呢?ls /tmp/bobbying|echo not exist&echo exist25这其实是有问题的,为什么呢?由图7-2的流程介绍,我们知道命令是一个一个往后执行,因此在上面的例子中,如果/tmp/bobbying不存在时,会进行如下动作。若ls/tmp/bobbying不存在,则回传一个非0的数值。接下来经过|的判断,发现前一个命令回传非0的数值,因此,程序开始运行echo not exist,而echo not
37、exist 程序肯定可以运行成功,因此会回传一个0值给后面的命令。经过&的判断,所以就开始运行echo exist。这样,在这个例子里面竟然会同时出现not exist与exist,是不是很有意思啊!请读者仔细思考。特别提示:经过这个例题的练习,你应该了解,由于命令是一个接着一个运行的,因此,如果真要使用判断,那么&与|的顺序就不能搞错。一般来说,假设判断式有3个,也就是,command1&command2|command3,而且顺序通常不会变。因为一般来说,command2与command3会放置肯定可以运行成功的命令,因此,依据上面例题的逻辑分析,必须按此顺序放置各命令,请读者一定注意。2
38、65工作环境设置文件shell环境依赖于多个文件的设置。环境设置文件有两种,一种是系统环境设置文件,另一种是个人环境设置文件。(1)系统中的用户工作环境设置文件。登录环境设置文件:/etc/profile。非登录环境设置文件:/etc/bashrc。(2)用户设置的环境设置文件。登录环境设置文件:$HOME/.Bash_profile。非登录环境设置文件:$HOME/.bashrc。系统中的用户环境文件设置对所有用户均生效,而用户设置的环境设置文件对用户自身生效。用户可以修改自己的用户环境设置文件来覆盖在系统环境设置文件中的全局设置。例如,用户可以将自定义的环境变量存放在$HOME/.Bash
39、_ profile中;用户可以将自定义的别名存放在$HOME/.bashrc中,以便在每次登录和调用子shell时生效。注意:只有在特定的情况下才读取profile文件,确切地说是在用户登录的时候读取。当运行shell脚本以后,就无须再读profile。277.3 任务3 熟练掌握正则表示法 正则表示法就是处理字符串的方法,它以“行”为单位来进行字符串的处理。正则表示法透过一些特殊符号的辅助,可以让使用者轻易达到查找/删除/替换某些特定字符串的工作。7.3.1 子任务1 掌握grep的高级使用格式:grep -A-B -color=auto 查找字符串查找字符串 filename选项与参数的含
40、义如下。-A:后面可加数字,为after的意思,除了列出该行外,后续的n行也列出来。-B:后面可加数字,为befor的意思,除了列出该行外,前面的n行也列出来。-color=auto:可将搜寻出的正确数据用特殊颜色标记。【例7-5】用dmesg列出核心信息,再以grep找出内含IPv6的那行。rootRHEL7-1#dmesg|grep IPv6 20.944553 IPv6:ADDRCONF(NETDEV_UP):ens38:link is not ready 26.822775 IPv6:ADDRCONF(NETDEV_UP):virbr0:link is not ready 553.27
41、6846 IPv6:ADDRCONF(NETDEV_UP):ens38:link is not ready 553.282437 IPv6:ADDRCONF(NETDEV_UP):ens38:link is not ready 553.284846 IPv6:ADDRCONF(NETDEV_UP):ens38:link is not ready 553.286861 IPv6:ADDRCONF(NETDEV_CHANGE):ens38:link becomes ready#dmesg可列出核心信息,通过grep获取IPv6的相关信息。不过没有行号与特殊颜色显示。28【例7-6】承上题,要将获取
42、到的关键字显色,且加上行号(-n)来表示。【例7-7】承上题,在关键字所在行的前一行与一行也一起找出来显示。rootRHEL7-1#dmesg|grep -n -color=auto IPv61903:20.944553 IPv6:ADDRCONF(NETDEV_UP):ens38:link is not ready1912:26.822775 IPv6:ADDRCONF(NETDEV_UP):virbr0:link is not ready1918:553.276846 IPv6:ADDRCONF(NETDEV_UP):ens38:link is not ready1919:553.2824
43、37 IPv6:ADDRCONF(NETDEV_UP):ens38:link is not ready1920:553.284846 IPv6:ADDRCONF(NETDEV_UP):ens38:link is not ready1922:553.286861 IPv6:ADDRCONF(NETDEV_CHANGE):ens38:link becomes ready#除了会有特殊颜色外,最前面还有行号rootRHEL7-1#dmesg|grep -n -A1 -B1 -color=auto IPv61902-20.666378 ip_set:protocol 61903:20.944553 I
44、Pv6:ADDRCONF(NETDEV_UP):ens38:link is not ready1922:553.286861 IPv6:ADDRCONF(NETDEV_CHANGE):ens38:link becomes ready1923-555.495760 TCP:lp registered#如上所示,你会发现关键字1903所在的前一行及1922后一行也都被显示出来#这样可以让你将关键字前后数据找出来进行分析297.3.2 子任务2 练习基础正则表达式练习文件sample.txt的内容如下 rootRHEL7-1#pwd/rootrootRHEL7-1#cat /root/sample.
45、txtOpen Source is a good mechanism to develop programs.apple is my favorite food.Football game is not use feet only.this dress doesnt fit me.However,this dress is about$3183 dollars.MGNU is free air not free beer.MHer hair is very beauty.MI cant finish the test.MOh!The soup taste good.Mmotorcycle is
46、 cheap than car.This window is clear.the symbol*is represented as start.Oh!My god!The gd software is a library for drafting programs.MYou are the best is mean you are the no.1.The world is the same with glad.I like dog.google is the best tools for search keyword.goooooogle yes!go!go!Lets go.#I am Bo
47、bby30(1)查找特定字符串。假设我们要从文件sample.txt当中取得“the”这个特定字符串,最简单的方式是:rootRHEL7-1#grep -n the /root/sample.txt8:I cant finish the test.12:the symbol*is represented as start.15:You are the best is mean you are the no.1.16:The world is the same with glad.18:google is the best tools for search keyword.如果想要反向选择呢,即
48、当该行没有“the”这个字符串时才显示在屏幕上:rootRHEL7-1#grep -vn the /root/sample.txt如果你想要获得不论大小写的“the”这个字符串,则执行rootRHEL7-1#grep -in the /root/sample.txt8:I cant finish the test.9:Oh!The soup taste good.12:the symbol*is represented as start.14:The gd software is a library for drafting programs.15:You are the best is me
49、an you are the no.1.16:The world is the same with glad.18:google is the best tools for search keyword.31(2)利用中括号 来搜寻集合字符。对比“test”或“taste”这两个单词可以发现,它们有共同点“t?st”存在。这个时候,可以这样来查寻:rootRHEL7-1#grep -n taest /root/sample.txt8:I cant finish the test.9:Oh!The soup taste good.其实 里面不论有几个字符,都只代表某一个字符,所以,上面的例子说明
50、需要的字符串是tast或test。而如果想要搜寻到有“oo”的字符时,则使用:rootRHEL7-1#grep -n oo /root/sample.txt1:Open Source is a good mechanism to develop programs.2:apple is my favorite food.3:Football game is not use feet only.9:Oh!The soup taste good.18:google is the best tools for search keyword.19:goooooogle yes!32 如果不想要“oo”前