Linux培训学习记录第3课Word下载.docx
- 文档编号:16525174
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:34
- 大小:752.87KB
Linux培训学习记录第3课Word下载.docx
《Linux培训学习记录第3课Word下载.docx》由会员分享,可在线阅读,更多相关《Linux培训学习记录第3课Word下载.docx(34页珍藏版)》请在冰豆网上搜索。
注意:
如果需要匹配一个由相同字母组合的连续字符串是,需要用”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’结尾的字串
美元符:
--$--在正则表达式中匹配行尾
“^$”匹配空行
egrep“^[0-9][0-9]*$”匹配数字组成的行,“^[0-9[:
space:
]][0-9[:
]]*$”数字和空格混合(不匹配全空格)
egrep“^[a-z][a-z]*$”匹配数字组成的行,“^[a-z[:
]][a-z[:
]]*$”字母和空格混合(不匹配全空格)
方括号:
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中单双引号的区别:
单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符,而不会有特殊符号。
利用变量解释单双引号的区别:
转义”尖角号”
--\<
……\>
--用于表示单词的边界,不被转义的尖角号表示其字面意思:
“小,大于号”
“\<
the\>
”
扩展元字符:
问号
--?
--匹配零或一个前面的字符.它一般用于匹配单个字符.
加号
--+--匹配一个或多个前面的字符,与*的唯一区别是”+”不匹配零个字符的情况,
也就是不会出现空格行的情况。
----有待商榷,实际操作与文章内容不符合
2012-04-0722:
17
正则表达式加号和问号或者星号和问号一起用
原地地址是:
像+*?
以及{M,N}这几种量词(匹配数量)默认是属于贪婪量词,进行贪婪匹配什么叫做贪婪匹配呢?
贪婪就是尽可能的多匹配,贪心的意思。
比如现在目标字符串是AAAA,四个A组成的字符串,A*和A+都会匹配AAAA。
A?
则会匹配A这就是贪婪匹配,实际运用中,有的时候我们却希望尽可能少的匹配。
比如目标字符串<
span>
a<
/span>
<
b<
此时如果我们使用了贪婪量词<
.*<
则会匹配<
。
整个字符串可是我们只想要匹配第一对span标签怎么办?
此时就需要用到懒惰量词,意思也很明显了,能偷懒就偷懒,呵呵,懒惰量词与贪婪量词的差别就是在贪婪量词的后面加个?
号,就构成了懒惰量词,如下表:
贪婪量词懒惰量词
A*
A*?
A+A+?
A?
A?
?
A{M,N}A{M,N}?
还是以目标字符串AAAA来讨论A*?
,*号是匹配0次或多次,要偷懒怎么办呢?
当然是最少次数了,也就是0,所以在这里匹配的结果是没有匹配到任何内容。
A+?
:
+是1次或多次,分析方法同上,最少次数是1次,所以匹配结果就是A。
?
是0次或1次,所以这里也不进行匹配,会偷懒吧,呵呵再来看看刚刚的<
要匹配第一对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‘/\<
this\>
/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次时才删除
s/\(.\)\1*/\1/g'
表示将多个连续的字符替换为一个字符(临时寄存器生成之后可以复用sed'
)
实例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>
‘<
opearate>
{print<
items>
}’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
引号外的空格不会被
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 培训 学习 记录