《linux正则表达式》PPT课件.ppt_第1页
《linux正则表达式》PPT课件.ppt_第2页
《linux正则表达式》PPT课件.ppt_第3页
《linux正则表达式》PPT课件.ppt_第4页
《linux正则表达式》PPT课件.ppt_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

正则表达式,曾树洪,正则表达式,很多不同的unix命令都采用一种便捷一致的方法来说明匹配模式,这种方法就是正则表达式,先学习一个命令:grep,grep -acinv 搜索字符串 filename -c:计算找到搜索字符串 的次数。 -n:输出行号 -v:反向选择 -l只给出包含给定模式的文件列表,而不给出文件中的匹配行 -o 只输出匹配的内容,搜索特定字符串,$ grep n the express $ grep vn the express $ grep -l the *.c 在所有源文件中查找the,列出包含the 的文件名,的使用,$ grep n taest express $ grep n oo express $ grep n goo express $ grep n a-zoo express $ grep n 0-9 express,和$,$ grep n the express $ grep n a-z express $ grep n a-zA-Z express $ grep n .$ express $ grep n $ express $ grep v $ express | grep v #,. 和*,$ grep n gd express $ grep n ooo* express $ grep n goo*g express $ grep n g*g express $ grep n g.*g express $ grep n 0-90-9* express,$ grep n o2 express $ grep n go2,5g express $ grep n go2,g express,字符类 描述,:alnum: 字母数字 a-z A-Z 0-9 :alpha: 字母 a-z A-Z :blank: 空格或制表键 :cntrl: 任何控制字符 :digit: 数字 0-9 :graph: 任何可视字符(无空格) :lower: 小写 a-z :print: 非控制字符 :punct: 标点字符 :space: 空格 :upper: 大写 A-Z :xdigit: 十六进制数字 0-9 a-f A-F,字符类 描述,注意区别以下两个命令: grep -n :space:are express grep -n :space:*are express,保存匹配的字符串:(),将捕获的正则表达式匹配的字符串存储在编号为1到9的“寄存器”中。 $ grep n o2 express $ grep n (.) express 匹配行首的第一个字符 $ grep n (.)1 express 如果一行的头两个字符相同,就匹配他们 $ grep n (.).*1$ express 匹配一行中头一个字符跟最后一个字符相同的行。,正则表达式与命令行特殊符号的区别,$ ls l * ls | grep n .* $ ls z* ls | grep n z.* $ ls !z*,sed的使用,非交互式行编辑器 顺序逐行将文件读入到内存中。然后,它执行为该行指定的所有操作,并在完成请求的修改之后将该行放回到内存中,以将其转储至终端,sed工作原理图,sed的语法,sed address1,address2 options command filename,sed删除功能d,d:Delete pattern space. Start next cycle. 观察命令结果:sed -e d express 删除指定行:sed -e 1d express 地址范围 :sed -e 1,10d express 从一行开始每隔一行删一行:sed 01d express 从第二行开始每隔7行删一行:sed17d express,sed删除功能,带规则表达式的地址 删除注释行:sed -e /#/d /etc/services | more 删除空行:sed -e /$/d express 删除第一行到空行:sed -e 1,/$/d express 删除最后一行:sed -e $d express 删除包含apple的行到包含Her的行: sed -e /apple/, /Her/d express,sed打印功能,p:打印命令 注意观测下面两个命令的区别: sed -n 1p express sed 1p express -n 安静模式,练习题,打印tot文件中从包含 “BEGIN“ 的行开始,并且以包含 “END“ 的行结束的文本块: 思考: 1 如果文件中没有“BEGIN”会怎样? 2 如果文件中没有“END”会怎样?,练习题,只打印 C 源文件中的 main() 函数,练习题,删除tot文件中从BEGIN开到END结束的块中包含Name的行 sed /BEGIN/,/END/Name/d; tot,sed功能:替换,s/old value/new value/ 实例: $ echo my name is zsh | sed s/zsh/shz/,多次修改,1 使用 e 选项 实例: $ echo my name is zsh | sed -e s/is/are/ -e s/zsh/shz/ $,多次修改,2 用分号来分隔命令 实例: $ echo my name is zsh | sed s/is/are/; s/zsh/shz/ 注意分号必须是紧跟斜线之后的下一个字符,全局替换,g sed默认处理每一行中出现的第一个选定序列,如果要处理出现的每一个项目,使用g 实例: $ echo my name is zsh zsh | sed s/zsh/shz/g,替换每行第N个匹配,$ echo my name is zsh zsh | sed s/zsh/shz/1 $ echo my name is zsh zsh | sed s/zsh/shz/2,练习题,cat myfile.html This is what I meant. 删除HTML标记,也就是要得到: This is what I meant.,sed替换功能案例,用sed实现unix2dos命令功能 unix2dos express cat -v express sed -i s/.$/ express 思考,怎样用sed命令将unix格式文件转换成dos格式?,案例,案例:老大要求我替换一个大容量文件(大约6-7G)的某些信息,直接用vim打开手动编辑的话那速度简直是苦不堪言,于是我再次想到了awk。仅仅是一些替换工作就用awk太小题大做了,而且在我用awk处理的时候出了一个大问题:文件太大,awk无法打开,我没有对这样的异常做防御,导致后面的操作出现了一连串的问题,最终的结果就是我用了一个空文本替换了刚才那个6-7G的文件。幸好还有备份,汗! 。正在我。,老大已经搞好了,就是用了一行sed: sed -i XXX -e s/XXX/XXX/g,y命令,y是一个管局命令,拒绝使用后缀flag/g sed y/1234567890/abcdefghij/ sedy,nN命令,n N Read/append the next line of input into the pattern space. 打印奇数行: cat -n express | sed -n p;n 打印偶数行: cat -n express | sed -n n;p 思考下面的功能: cat -n express | sed -n p;N cat -n express | sed -n N;p cat -n express | sed -n p;d cat -n express | sed d;n cat -n express | sed n;d cat -n express | sed 1d;n;d,案例,输出匹配行的下一行 sed -n /apple/n;p express 区别: sed -n /apple/n;p express,sed更多功能,h :拷贝模板块的内容到内存中的缓冲区。 H :追加模板块的内容到内存中的缓冲区 g :获得内存缓冲区的内容并替代当前模板块中的文本。 G :获得内存缓冲区的内容并追加到当前模板块文本的后面 =: 出行号 x :互换模板块中的文本和缓冲区中的文本。,案例,为文件加行号 sed = express | sed N;s/n/:/ 给非空行加行号 sed /./= express | sed /./N;s/n/:/,案例,删除连续重复行 sed $!N;/(.*)n1$/!P;D chongfu,案例,用sed实现tac功能 sed -e 1!G;h;$!d express,案例,从字串中解析出两个子串(前2各字符和后9个字符) echo “WeLoveChinaUnix“|sed -e H;s/().*/1/;x;s/.*(.9)$/1/;x;G;s/n/ / 备注:该例仅仅说明各种命令的功能,如果单纯为了完成任务,以下命令更简单: echo “WeLoveChinaUnix“|sed s/().*(.9)$/1 2/,案例,观测脚本ip的内容并分析其功能 注意观察 ifconfig ifconfig | ./ip,练习题,文件a的内容如下: 1 2 3 4 5 6 7 执行sed N;$!D a 结果?,保存输出文件,$ sed /two/ s/1/2/ sample_one sample_two 直接修改原文件:-i sed -i $d express,脚本文件,$ cat sedlist /two/ s/1/2/ /three/ s/1/3/ 注意当调用 “-f“ 选项时,在源文件内或命令行中不使用撇号,$ sed -f sedlist sample_one one 1 two 2 three 3 one 1 two 2 two 2 three 3 $,“-f” 选项,Sed功能3: 增加和插入文本,$ sed $a This is where we stop the test sample_one one 1 two 1 three 1 one 1 two 1 two 1 three 1 This is where we stop the test $,注意: 美元符号 ($) 表示文本将被添加到文件的末尾。反斜线 () 是必需的,它表示将插入一个回车符。,Sed功能3: 增加和插入文本,$ sed 3a This is where we stop the test sample_one one 1 two 1 three 1 This is where we stop the test one 1 two 1 two 1 three 1 $,Sed功能3: 增加和插入文本,$ sed 3i This is where we stop the test sample_one one 1 two 1 This is where we stop the test three 1 one 1 two 1 two 1 three 1 $,添加和插入的区别: 添加跟在指定的行之后,而插入从指定的行开始,读写文件,$ sed /two/ s/1/2/ /three/ s/1/3/ 1,3 w sample_three sample_one one 1 two 2 three 3 one 1 two 2 two 2 three 3 $,$ cat sample_three one 1 two 2 three 3 $,修改命令,替换是对字符逐个进行,而修改功能与删除类似,它影响整行: $ sed /two/ c We are no longer using two sample_one,提前退出,$ sed /two/ s/1/2/ /three/ s/1/3/ 5q sample_one one 1 two 2 three 3 one 1 two 2 $,$ sed /two/ s/1/2/ /three/ s/1/3/ /three/q sample_one one 1 two 2 three 3 $,提前退出,思考: sed 110q filename 有什么作用?,cut,cut -d “分隔字元“ -cf fields 參數說明: -d :後面接的是用來分隔的字元,預設是空白字元 在用cut从文件中析取字段时,如果没有指定分隔符,默认分隔符是制表符。 -c :後面接的是第幾個字元 -f :後面接的是第幾個區塊?,cut,$ cut /etc/passwd | cut -d : -f 1 $ last | cut -d f 1 $ last | cut d f 3,5 $ last | cut c 1-20 $ last | cut c 12-,paste,paste格式为: paste -d -s - file1 file2 -d 指定不同于空格或tab键的域分隔符。例如用分隔域,使用- d 。 -s 将每个文件合并成行而不是按行粘贴。 - 使用标准输入。例如ls -l |paste -,意即只在一列上显示输出。 粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同,paste:,$ cat names tong fred $ cat numbers (0752) 2121211 (0752) 2121212,$ paste names numbers tong (0752) 2121211 fred (0752) 2121212 $ paste numbers names (0752) 2121211 tong (0752) 2121212 fred,paste,$ paste d: numbers names (0752) 2121211 : tong (0752) 2121212 : fred,$ paste s names numbers tong fred (0752) 2121211 (0752) 2121212 $ ls /etc | paste -d“ “ - - - - $ ls /etc | paste -d“ “ -,sort,排序 -u 在结果中去掉重复行 -r 反序排序 -o 指定输出文件 -n 使用算术方法排序(默认是字符) -kn 按指定字段排序 -t 分隔符 (默认是TAB健),测试是否分类排序,cat video.txt video.txt包含了上个季度家电商场的租金情况。各域为:(1)名称,(2)供货区代码,(3)本季度租金,(4)本年租金。域分隔符为冒号 -c 测试是否分类排序,如果没有,出现错误信息,如果有,没有信息输出 注意观测以下命令 sort -c video.txt sort video.txt video2.txt sort -c video2.txt,保存输出,-o 保存输出 sort video.txt video2.txt 等同 sort video.txt -o video2.txt 注意观测以下命令结果: cp video.txt video sort video -o video cat video sort video video cat video,更多功能,反向排序: sort -r video.txt 按指定域分类: sort -t: -k3 video.txt 按数字大小排序: sort -t: -k3 -n video.txt 删掉重复行: sort -u video.txt,更多功能,sort video.txt video2.txt sort -c video2.txt 测试video2.txt是否分类 sort -uc video2.txt 测试video2.txt是否有重复行,更多功能,同时处理多个文件 sort -m file1 file2 file3 outfile 在将所有输入文件一起进行 sort -m 之前,每个文件都必须经过排序 方法2: cat file1 file2 file3 | sort outfile,uniq,去掉(连续)重复行 一般u n i q假定文件已分类,并且结果正确。(所以一般是配套sort使用) -i 忽略大小写 -c 计算行出现的次数 -d 找出重复行,除去重复行,注意观测以下命令 cat uniq.txt uniq uniq.txt sort uniq.txt | uniq,打印每一重复行出现次数,-c Uniq -c uniq.txt Sort uniq.txt uq.txt Uniq -c uq.txt,只显示不重复行,-u Uniq -u uq.txt,显示重复出现的不唯一行,-d uniq -d uq.txt,对特定域进行测试,-f fn表示对第n+1列开始进行测试 cat part.txt uniq -f4 parts.txt uniq -f5 parts.txt,应用实例,系统日志的某些项会复制许多次,这使得查看日志很难。使用简单的 uniq 无法完成任务,因为每一项都以不同的时间戳记开头。但是如果您告诉它跳过所有的时间字段,您的日志一下子就会变得更加便于管理。试一试 : uniq -f3 /var/log/messages,join连接两个文件,将两个包含有共同字段的文件连接在一起,默认情况,2个文件的第一字段是共同字段。 cat name.txt cat town.txt join name.txt town.txt name.txt有5行, town.txt有5行,join处理后的文件只有4行。,不匹配连接,join -a1 -a2 names.txt town.txt join -a1 names.txt town.txt,选择部分列连接,join -o 1.1,2.2 names.txt town.txt 结果将只有name

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论