Linux培训学习记录第3课.docx

上传人:b****6 文档编号:3620253 上传时间:2022-11-24 格式:DOCX 页数:34 大小:752.87KB
下载 相关 举报
Linux培训学习记录第3课.docx_第1页
第1页 / 共34页
Linux培训学习记录第3课.docx_第2页
第2页 / 共34页
Linux培训学习记录第3课.docx_第3页
第3页 / 共34页
Linux培训学习记录第3课.docx_第4页
第4页 / 共34页
Linux培训学习记录第3课.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

Linux培训学习记录第3课.docx

《Linux培训学习记录第3课.docx》由会员分享,可在线阅读,更多相关《Linux培训学习记录第3课.docx(34页珍藏版)》请在冰豆网上搜索。

Linux培训学习记录第3课.docx

Linux培训学习记录第3课

1、初级安装=光盘安装--OK

2、中间装=网络安装

3、高级安装=自动安装:

机器上架插网线

Dhcp+tftp+kickstart(服务器端脚本)

●安装和登录命令:

login、shutdown、halt、reboot、mount、umount、chsh

●文件处理命令:

file、mkdir、grep、dd、find、mv、ls、diff、cat、ln

●系统管理相关命令:

df、top、free、quota、at、lp、adduser、groupaddkill、crontab、tar、unzip、gunzip、last

●网络操作命令:

ifconfig、ip、ping、netstat、telnet、ftp、route、rloginrcp、finger、mail、nslookup

●系统安全相关命令:

passwd、su、umask、chgrp、chmod、chown、chattr、sudo、pswho

《Linux命令第三讲》

-20121014

一、正则表达式:

1、正则表达式的定义

一个正则表达式的样式是一个字符串,字符串里的字符被称为元字符。

它代表着匹配或指定一个模式,比表面看到的富含更多意义。

2、正则表达式的组成

a、一个字符集:

纯字符集组成,无其他元字符,可以从字符表面理解其意思(即所见到的)

b、锚:

指定在一行文本中要匹配的位置,例如^和$分别代表“以什么开始”和“以什么结束”的锚。

c、修饰符:

一类符号用于扩展或缩小匹配文本行的范围,如*()\,其中*含义比较特殊

3、正则表达式组成训练:

星号

--*--匹配一个字符的零次或一次或多次(与传统的*有所区别)

“aakk*”可匹配的内容(可不止是必须以”aa”开头的,最少”kk”结束的)匹配”aa”和一个或更多的”k”加其他字符;

如果正则表达式的元字符是”aak*”则代表aa加零个一个多个k的组合。

(注意,这里的匹配不是等于。

匹配相当于可以搜索到,等于相当于可替换。

看下图体会匹配和等于的区别—摘自讲义).

直接匹配“*”很多情况下只能匹配“0个该字符”,如下前两个命令的结果:

注意:

如果需要匹配一个由相同字母组合的连续字符串是,需要用”cc*”来表示,如上图最后一个命令及结果显示。

典型用法:

1、把所有重复字串都用本身的一个字符代替,应该如何做?

下图只是用了临时寄存器一个位置:

2、sed‘s/口口*/口/’

将多个空格(1或N个空格)替换为1个空格,常用于规范文本的空格数量

3、sed‘s/c*/z/g’

第一个加z,非c的字符加z,是c或多个c的情况下换成z

4、sed’s/*//g’和sed’s/.*//g’都是删除所有,意义不同,但对任意字串操作,结果相同

点的用法:

—.—匹配除了换行符之外的任意一个字符。

怀疑:

”.”可以匹配1个或多个字符,是由于正则贪婪造成的。

echo“a”|egrep“aa.”无法匹配,是因为”aa.”要求最少一个a附加至少一个任意字符才能匹配,所以“a”的匹配结果是“无结果

脱字符:

--^--匹配一行的开头,但依赖其后跟随的上下文环境,可能因为上下文与目标字串不能严格匹配而造成不符合要求。

正则表达式中表示否定一个字符集的意思

[^’xxx’]以’xxx’开头的字串

[‘yyyy’$]以’yyyy’结尾的字串

美元符:

[^’xxx’]以’xxx’开头的字串

[‘yyyy’$]以’yyyy’结尾的字串

--$--在正则表达式中匹配行尾

“^$”匹配空行

egrep“^[0-9][0-9]*$”匹配数字组成的行,“^[0-9[:

space:

]][0-9[:

space:

]]*$”数字和空格混合(不匹配全空格)

egrep“^[a-z][a-z]*$”匹配数字组成的行,“^[a-z[:

space:

]][a-z[:

space:

]]*$”字母和空格混合(不匹配全空格)

方括号:

s

--[……]—在正则表达式中表示匹配括号中的一个字符,即[]中的字符

“[abnc]”匹配字符a,b,c,n中的一个或多个

只匹配一个(或多个指定了具体字串)字母正则式:

“[c-n]”匹配从字符(小写字母)c到n之间的任意一个字符

“[C-Fa-h]”匹配从字符(大写字母)C到F或(小写字母)a到h之间的任意一个字符

“[a-z0-9]”匹配任意小写字母或数字

“[^b-f]”匹配不在小写字母b到f之间的其他所有字符。

这是正则表达式中反转意思或取非的

一个例子.(就好像在别的情形中!

字符所扮演的角色).

“[Yy][Ee][Ss]”多括号字符集组合,类似于排列组合,YES,YEs,Yes,YeS,yES,yEs,yeS,yes,但yes的顺序不能变

反斜杠字符

--\--转义字符,使字符组合能表示转义字符后面字符的原本字面意思

“\$”表示原字面意思”$”美元符,而不是以什么为结尾的正则表达式的“锚”。

注意:

转义符用途广泛,不仅仅用于正则上的匹配。

在脚本中,有些时候不想让特殊字符立即生效,就需要使用转义符。

比如:

Ssh到1.103机器执行echo“$PWD”的命令,如果没有转义$符号,该命令在linux中执行前解释后实际就会是:

ssh192.168.1.103echo/home/training/zhengze。

转义之后,该命令在linux执行前解释后会是:

ssh192.168.1.103echo$PWD

补充linux中单双引号的区别:

单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符,而不会有特殊符号。

利用变量解释单双引号的区别:

转义”尖角号”

--\<……\>--用于表示单词的边界,不被转义的尖角号表示其字面意思:

“小,大于号”

“\

扩展元字符:

问号

--?

--匹配零或一个前面的字符.它一般用于匹配单个字符.

加号

--+--匹配一个或多个前面的字符,与*的唯一区别是”+”不匹配零个字符的情况,

也就是不会出现空格行的情况。

----有待商榷,实际操作与文章内容不符合

2012-04-0722:

17

正则表达式加号和问号或者星号和问号一起用

原地地址是:

 

像+*?

以及{M,N}这几种量词(匹配数量)默认是属于贪婪量词,进行贪婪匹配什么叫做贪婪匹配呢?

贪婪就是尽可能的多匹配,贪心的意思。

比如现在目标字符串是AAAA,四个A组成的字符串,A*和A+都会匹配AAAA。

A?

则会匹配A这就是贪婪匹配,实际运用中,有的时候我们却希望尽可能少的匹配。

比如目标字符串ab此时如果我们使用了贪婪量词.*则会匹配ab

整个字符串可是我们只想要匹配第一对span标签怎么办?

此时就需要用到懒惰量词,意思也很明显了,能偷懒就偷懒,呵呵,懒惰量词与贪婪量词的差别就是在贪婪量词的后面加个?

号,就构成了懒惰量词,如下表:

贪婪量词懒惰量词

A* A*?

A+A+?

A?

A?

?

A{M,N}A{M,N}?

还是以目标字符串AAAA来讨论A*?

,*号是匹配0次或多次,要偷懒怎么办呢?

当然是最少次数了,也就是0,所以在这里匹配的结果是没有匹配到任何内容。

A+?

+是1次或多次,分析方法同上,最少次数是1次,所以匹配结果就是A。

A?

?

是0次或1次,所以这里也不进行匹配,会偷懒吧,呵呵再来看看刚刚的ab要匹配第一对span,用懒惰量词就是.*?

我已经说的够明白了吧?

这些内容我以前都是查了好多资料才知道的。

正则表达式是相当强大的语言,尤其在进行字符匹配和查找时,当然要需要花一定的时间才能掌握。

----有待商榷,实际操作与文章内容不符合

转义“大括号”

--\{\}—指示前面正则表达式匹配的次数

无转义标示符则只表示大括号,不属于基本正则表达式内容,只是技巧。

“[0-9]\{5\}”精准匹配5个数字(0,1,2,3,4,5,6,7,8,9中的数字)。

注意:

大括号不能在“经典”(不是POSIX兼容)的正则表达式版本的awk中使用.然而,gawk有一个选项--re-interval来允许使用大括号(不必转义).

bash$echo2222|gawk--re-interval'/2{3}/'

2222

Perl和一些egrep版本不要求转义大括号.

圆括号

--()--括起一组正则表达式.它和下面要讲的"|"操作符或在用expr进行子字符串提取(substringextraction)一起使用很有用.

竖线

--|--"或"正则操作符用于匹配一组可选的字符.

二、流编辑器(sed)

Sed是流线型、非交互式编辑器。

它允许你执行与vi和ex编辑器里一样的编辑任务。

Sed程序不是与编辑器交互式工作的,而是让你在命令行里敲入编辑的命令,然后再屏幕上查看命令输出的结果。

Sed编辑器按一次处理一行的方式来处理文件,并把结果输出到屏幕。

在本次课程中,只讲解sed最常用的几种功能。

这几种功能可以满足日常linux运维需求,但是只能涵盖sed功能的冰山一角。

想要知道的命令:

1、删除每行从第四个开始向后的字符,并显示结果

2、只想显示每行第一个字符,或者最后一个字符

1、按照行号打印

格式:

sed<-n>‘n1<,n2>p’file

实例1、只打印第一行

sed‘1p’1.txt出现重复,sed–n‘1p’1.txt可消除重复行

参数-n:

关闭显示打印功能

catxinghao.txt|sed'1,7p',p表示打印命令

不加最后的’p’则报错:

catxinghao.txt|sed–n‘1,7p’

匹配:

catxinghao.txt|sed-n'/abc/p'

实例2、消除重复显示的情况

sed‘2,4p’1.txt出现重复行,sed-n‘2,4p’1.txt可以消除重复显示的情况

》》》打印匹配行(相当于egrep)《《《

在引号中,在打印命令“p”前,可以放置一对/标识符,来代表匹配。

形如‘//’。

实例3、打印含有字母“c”的行

sed–n‘/c/p’1.txt

实例4、打印以某个字母开头的行

sed–n‘/^a/p’1.txt

实例5、打印指定重复数量字母所在的行

实例6、打印bb与cd之间的行

catseds.txt|sed–n‘/bb/,/cd/p’

基于打印包含一个字串字符串所在行的正则表达式sed–n‘/xxx/p’seds.txt

扩展正则贪婪:

”^.*c”会匹配到最后一个c字母出现的位置,在操作时需要注意

可以看到,匹配在第一个“c”处并没有停止,知道最后一个c的出现才停止。

实例7、显示指定行中被替换后结果

sed‘3s/this/that/’第三行中的this替换成that

2、删除命令d

在默认情况下,sed的删除操作并不直接作用于文件本身,而仅仅是在打印的时候不打印匹配的行,有些类似于grep–v。

如果需要删除操作作用于文件,在有文件写权限的前提下,可以使用sed–i参数来使删除操作作用于文件。

注意:

不是所有的unix自带的sed工具都有这个功能。

》》》删除指定行《《《

实例1、

实例1、删除第三行,删除1~7行

扩展删除第1,6,7行,

可以看到,sed命令仅仅是在打印的时候忽略了第三行,实际上并没有删除第三行。

注意:

在实际操作中,不加-i参数反而更加常用。

一般的做法是保留原文件,仅仅将sed的结果重定向。

注意:

一般在删除操作中,不加-n参数,-n参数告诉sed只显示出操作的行,对于打印命令很有效果,但是对于删除操作,操作的行已经不存在,如果再不显示未操作行,将看不到任何结果

sed‘/\/d’删除包含this的行,如果删除指定的行,则要用管道符

sed-I‘/\/d’1.txt将删除后形成的文件更新源文件(##危险操作,应该先确认结果,再添加-i参数##)

》》》删除匹配行《《《

实例2、删除以”this”单词开头(结尾)的行

(按条件定点清除目标)

总结:

用界定符表示单词需要考虑多种情况,如果使用锚定符则方便很多。

如果要删除含有this单词的行,不使用\<\>的话,正则的写法将要麻烦的多,尤其是在不确定该版本sed是否支持扩展正则的情况下,如下所示:

在sed中,可以用“;”来分隔若干个命令,这里分隔成三个删除命令。

这三个命令依次执行。

可以看到,依次匹配了this单词开头的情况,中间的情况,和结尾的情况。

虽然文本中没有this结尾的情况,但是如果我们拿到一个特别大的文件,那就无法确认是否有这种的情况。

注意:

建议不要使用这种方式,不是特别友好,看起来比较费劲。

不如写成sed‘//d’|sed‘//d’的管道形式,虽然多敲了一些字符,但是逻辑更加清晰。

并且管道的效率和例子中的写法效率是一样的。

实例2、删除连续的a和连续的d的行及两者间的行

注意:

这里很容易写成/aa*/,/dd*/,考虑为什么不正确。

实例3(无解):

精准删除指定单词或单词所在行

echo"woshimofeiwoshimofei"|seds/fei/yan/g精准匹配

转义字符\,如:

希望替换“.”为其他字符,则需要转移

转移的边界:

替换所有is为was,但开头和结尾需要特殊处理

实例4:

只显示数字的内容

假设一个文件,里面有数字和大小写以及一些字符,显示数字以外的内容。

提示:

使用“^”和“[]”来取得数字以外的内容

3、替换命令

在日常工作中,sed命令最常用的用途就是替换。

其实上面讲到的打印和删除,都可以使用grep或者grep–v来实现(匹配两行之间的操作不可以)。

Sed的其它功能也都可以有替代品,比如删除重复行等;更复杂一些的命令用的很少。

虽然sed的替换功能可以被tr命令代替一部分,但是tr命令并不支持正则。

于是,sed在运维人员眼中,甚至仅仅是一个替换命令。

sed的替换可以是字面上的替换,也可以是正则匹配的替换。

正则形式出现的替换会更多一些。

下面以一些例子讲解sed的替换用法:

实例1、sed替换的基本格式

catfile|sed‘s/aaa/MMMMM/’遇到第一个符合要求的字串进行替换,必须三个分隔符“/”

实例2、sed全局替换

catfile|sed‘s/查找的条件字串/替换为目标字串/’匹配第一次出现的进行替换

实例3、指定行替换

cat1.txt|sed‘4s/7777/wowwow/g’

习惯性的应该在分隔符后增加g用于全篇进行替换

实例4、匹配行替换

扩展:

sed‘/aa*/,/cc*/s/line/lines/g’把连续的a或连续的c的行中的Line替换为Lines

常见错误:

1、不使用全局命令;cat1.txt|sed‘example/s/a/an/’无全局命令则只匹配第一次

2、没有考虑被替换目标的限制(比如全局或者左右有空格);

3、被替换目标不应该使用正则表示;cat1.txt|sed‘/example/s/*a*/an/g’

注意:

sed的匹配模式中支持正则,替换成的目标是不支持正则的。

比如,s/.*/.*/,将把所有内容都换成”.*”

正确替换指定内容的方法:

cat1.txt|sed‘/example/s/a\(*example)/an\1/g’

解释该命令:

首先匹配example,因为只有example前的a出现了问题;

然后将“aexample”换成“anexample”,这样需要匹配”aexample”;

但是我们并不知道“a”和“example”之间有几个空格,不能想当然的认为是一个,于是匹配变成了“a*example”,这样可以匹配到一个或者多个空格;

最后,我们并不想改变修改后的格式,想要和修改前“a”和“example”之间的空格数保持一致,于是我们将“a”后面的匹配内容放到临时的寄存器中,这样在后面的替换目标那一项中,直接使用寄存器中的内容,可以保证“an”和“example”之间的格式与之前一样。

看上图就是一个更清楚的例子,保证了最后一行第一句话中的“a”后三个空格没有被改变,即保留了三个空格。

实例5、匹配行之间的替换

和打印和删除类似,替换也有这样的功能,虽然不常用。

●将连续”a”和连续”#”的两行及两行之间的字串”cc”全部替换成”CC”

●将连续”a”和连续”#”的两行及两行之间的单词”cc”全部替换成”CC”

注意:

字串可以重复,如ccccccc就代表了3个字串+一个不符合要求的字符c

不要忘记了“\<\>”表示锚定一个单词,也不要忘记s///中,第二个代表替换目标的区间不支持正则。

实例6、删除某些字符

扩展:

精准的删除字符、删除所有符合要求的字串)

可以看到,替换目标的区域空下来了,也就是把匹配的内容换成“空”。

实例6+、删除重复的字母

catxinghao.txt|sed's/\(.\)\1\1//g'删除连续重复2次的字母,(\(.\)表示已经匹配一次了),所以重复2次时才删除

catxinghao.txt|sed's/\(.\)\1*/\1/g'表示将多个连续的字符替换为一个字符(临时寄存器生成之后可以复用sed's/\(.\)\1*/\1/g')

实例7、在行首增加”#”

实例8、删除行尾的”.”

如果sed‘s/.$//g’则“.”代表了正则,结果将不同,结果为删除结尾最后一个字符,如上第二条命令。

实例9、删除多余空格

实例10、将连续字母变成一个,并只显示修改行

实例11、使用sed的修改参数,直接对文件生效

操作流程:

替换命令中也是可以禁止输出未改动或者未匹配项的,用-n参数,需要再次提醒,使用-n参数后,需要加上p命令才可以输出匹配或者修改的行;

在s///的匹配中,首先锁定某个字母[a-zA-Z]就是匹配任意一个字母;

然后匹配该字母的连续出现,这个时候使用连续的[a-zA-Z]是无法实现的(思考为什么),只能使用临时存储器,将上一个匹配的字母存入,然后使用“\1”再现上一个字母。

思考:

如果题干中没有要求只显示修改行,那么\([a-zA-Z]\)\1*就可以完成匹配,为什么?

答:

好像没啥影响

实例12、当前匹配对象中含有”/”

比如,将”/etc”换成”/usr/local/etc”,两种方法:

方法一:

通过转义符

这种方法令人费解。

方法二:

将s///换成任意字符分割,比如s###:

实际上,sed中替换‘s’后面可以跟除字母外的任意三个相同字符来做分隔符,甚至数字都可以,但是作为分隔符的符号在匹配和作为替换目标时,必须转移。

实例13、临时寄存器的使用

sed–n'/\(.\)/p'中的\(.\)表示将.(任意字符)存放在临时寄存器中

sed–n‘/\(.\)\1\1\1*/p’表示将.存放在3个(有了*就是以上的意思)临时寄存器,sed按行从上到下,正则表达式从左向右扫描,”\1”表示第一个临时寄存器。

如果出现两个\(xxxx\)表示有2个临时寄存器,xxxx表示正则式。

实例14、替换以”this”开头的行中的某字串

sed‘/^this/s/line/lines/g’先匹配以this开头的行,再将这些行的this修改为that

(可以使用“sed‘/^this/p’打印包含this开头的行)

三、AWK编程工具

awk是用来操作数据和产生报表的一种编程语言。

数据可能来自标准输入、一个或者多个文件或者是一个进程的输出。

awk可以用在命令行里用于简单操作,或者可以为了较大的应用而写到程序中。

awk从第1行到最后一行逐行扫描文件(或输入),并执行选定的操作(封装在花括号里)。

比如:

awk<-Fstring>‘{print}’filename

最常用的例子是cat/etc/passwd|awk–F:

‘/zhangzhe/{print$1}’。

含义是,查看/etc/passwd文件,结果给awk处理,首先用“:

”代替空格作为分隔符,然后从第一行到最后一行逐行扫描文件,执行匹配“zhangzhe”的操作,如果匹配则执行花括号中的打印第一个域的操作。

文件是必须的,如果没有文件,也可以使用管道传递数据。

Awk是一门编程语言,作为unix工具来使用简化了很多,但是仍然有许多编程语言的特性,可以对目标进行一些列的处理。

可以抽象的理解一下awk的处理过程,这个过程和sed相当类似。

如果抛开awk的BEGIN和END(参考《sed&awk》,这两部分是awk在读取文件前的操作和完成逐行操作后的操作)。

对于文件的每行,awk分两个阶段处理:

1.读取该行内容,分配临时寄存器,分配域名等操作;

2.对域做各种处理并输出。

也就是说,我们对每一行的操作,实际上有两个部分组成:

读入时和读入后。

1、Awk基本输出

1、最简单的选区域输出

cat/root/install.log|awk‘{print$1,$(NF-1),$NF}’---------逗号作为默认的空格符

可以看到,结果通过管道被awk处理后,只留下了第一列和第九列,语句的具体含义是:

花括号前没有任何的语句,说明是默认的对每一行进行操作,而没有任何的限制;

花括号中是打印语句,这里打印了$1和$NF和$(NF-1)。

Awk顺序的为每一个域分配域号,$1(或$1F)代表从左边起第一个域,$2代表第二个……。

也可以从右向左数,$NF代表最后一个,$(NF-1)代表倒数第二个域,$(NF-2)代表倒数第三个域;

打印语句中的“,”代表仍然使用默认的分隔符:

一个空格,来分隔打印出来的内容。

默认的分隔符分为输入和输出两种,输入可以使用“-F”参数来改变,输出的请参考《sedandawk》。

2、awk输出中分隔符的几种情况

echo“aabbccdd”|awk‘{print$1$2$4}’无空格的aabbdd

echo“aabbccdd”|awk‘{print$1”111”$2”ddd”,$4}’aa111bbddddd

引号外的空格不会被

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1