当前位置: 首页 > 科技观察

Shell—正则表达式(grep命令,sed工具)

时间:2023-03-12 03:42:01 科技观察

前言正则表达式对于系统管理员来说是非常重要的,熟练使用正则表达式可以让工作变得更加轻松和方便。一、正则表达式概述正则表达式定义了正则表达式,也称为正则表达式。正则表达式使用字符串来描述和匹配一系列满足一定规则的字符串。方法,通过一些特殊的符号,来快速查找、删除、替换特定的字符串。正则表达式由普通字符组成:大小写字母、数字、标点符号以及其他一些符号元字符:在正则表达式中具有特殊含义的特殊字符正则表达式的用途正则表达式对于系统管理员来说非常重要是的,大量的系统运行过程中会产生一些信息,有些信息非常重要,有些信息只是信息性的。作为系统管理员,如果直接查看这么多信息和数据,是无法快速定位到重要信息的,比如“用户账号登录失败”、“服务启动失败”等信息。这时候可以通过正则表达式快速提取出“有问题”的信息。这样可以使运维工作更加简单方便。正则表达式分类基本正则表达式扩展正则表达式Linux中的文本处理工具支持基本正则表达式:grep;sed支持扩展正则表达式:egrep;awkbasicregularexpressionsMetacharactersBasicregularexpressions常用的正则表达式除了普通字符,公式部分还常见以下元字符■\:转义符,\!,\n等#让特殊元字符作为普通字符^:匹配字符串的开始位置示例:^a,^the,^#$:匹配字符串的结束位置示例:word$.:匹配除\n之外的任意字符示例:go.d,g..d*:匹配前面的子表达式0次或多次例子:goo*d,go.*d[list]:匹配列表中的一个字符例子:go[ola]d,[abc],[a-z],[a-z0-9]■[^list]:匹配任何不在列表list中的字符例子:[^a-z],[^0-9],[^A-Z0-9]■\{n,m\}:匹配前一个子串Expressionn到m次,有\{n\},\{n,\},\{n,m\}三种格式例:go\{2\}d,go\{2,3\}d、go\{2,\}d注:“o{1,}”等价于“o+”;"o{0,}"等价于"o*"2.grep命令2.1grep使用规则:-n:表示显示行号-i:表示不区分大小写-v:表示反向过滤[]:查找集合字符2.2使用示例grep-n'the'test.txt#文件检索带'the'的行并显示行号grep-vn'the'test.txt#文件反向检索不带'the'的行并显示该行numbergrep-n'sh[oi]rt'test.txt#文件检索带有'short''或'shirt'的行并显示行号grep-n'oo'test.txt#文件检索至少该行withcontinuousooanddisplaythelinenumbergrep-n'o\{2\}'test.txt#file检索至少连续oo的行并显示行号grep-n'o\{2,\}'test.txt#文件至少检索连续oo的行并显示行号grep-n'[^w]oo'test.txt#文件检索连续oo前不带w的行并显示行号grep-n'^[^w]oo'test.txt#文件检索除w以外的任何以*oo开头的行并显示行号grep-n'[^a-z]oo'test.txt#文件检索前面不是小写字母的行在连续oo中显示显示行号grep-n'[0-9]'test.txt#文件检索包含数字的行并显示行号grep-n'[^0-9]'test.txt#文件检索不包含纯数字并显示行号,非纯数字也会匹配grep-n'[^#]'test.txt#文件检索不包含#的行并显示行号grep-n'^the'test.txt#file检索以'the'开头的行并显示行号grep-n'^[a-z]'test.txt#File检索以小写字母开头的行并显示行grep-n'^[A-Z]'测试。txt#File检索以大写字母开头的行并显示行号grep-n'^[^a-zA-Z]'test.txt#File检索不以字母开头的行并显示行号grep-n'\.$'test.txt#文件检索以符号结尾的行并显示行号grep-n'^$'test.txt#文件检索空行并显示行号grep-n'w..d'test.txt#文件检索以w开头d结尾的两个字符的行,并显示行号grep-n'ooo*'test.txt#文件检索连续oo的行ortwoormorethanormore0lineanddisplaythelinenumbergrep-n'oo*'test.txt#文件检索带o或多于一个0的行并显示行号grep-n'w.*d'test.txt#检索以w开头,d结尾的文件,中间任意字符也可以是空行并显示行号grep-n'[0-9][0-9]*'test.txt#文件检索带有数字的行并显示Displaylinenumber3.sed工具sed(StreamEDitor)是一个强大而简单的文本分析和转换工具,可以读取文本,根据指定的条件编辑文本内容(删除、替换、添加、移动等),最后输出所有行或只输出输出一些处理过的行3.1sed工具使用规则sed的工作流程主要包括读取、执行和显示三个过程:sed从输入流(文件、管道、标准输入)中读取一行内容,存入一个临时缓冲区(也称为patternspace,patternspace)执行:默认情况下,所有sed命令都在patternspace中顺序执行,除非指定了行的地址,否则sed命令会在所有行中顺序执行。display:将修改后的内容发送到输出流。发送数据后,模式空间将被清除。在文件的所有内容都处理完之前,会重复上面的过程,直到处理完所有的内容。注意:默认情况下,所有sed命令都在模式空间中执行,因此除非使用重定向存储输出,否则输入文件不会更改。sed命令常用用法sed[option]'operation'参数sed[option]-fscriptfile参数sed命令常用选项-escript:指定sed编辑命令-fscriptfile:指定文件为sed编辑命令-h或–help:显示help-n,--quiet或silent:表示只显示处理后的结果。-i:直接编辑文本文件常用sed命令的操作a:add,在当前行下面增加一行指定内容。c:replace,将选中的行替换为指定的内容。d:删除,删除选中的行。i:插入,在选中行上方插入一行指定内容。p:打印,如果同时指定行,则表示打印指定行;如果没有指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。它通常与“-n”选项一起使用。s:replace,替换指定字符。y:字符转换。p:n#奇数行n:p#偶数行3.2使用示例1、输出符合条件的文本(p表示正常输出)nltest.txt|sed-n'p'#输出test.txt内容,nl是显示行号和内容,为了输出行号为nltest.txt的结果|sed-n'3p'#输出测试的第三行。txt内容,行号为nltest.txt|sed-n'2,5p'#outputtest。txt内容二到五行带行号nltest.txt|sed-n'p:n'#输出test.txt内容奇数行带行号,先删空格nltest.txt|sed-n'n:p'#o??utputtest.txt内容偶数行带行号,先删掉空格nltest.txt|sed-n'1,5{p;n}'#outputtest.txt内容奇数行1~5行带有行号nltest.txt|sed-n'1,10{n;p}'#输出test.txt偶数行1~10行号nltest.txtlsed-n'10,${n;p}'#输出test.txt内容10偶数行从该行到最后一行的行号sed-n'/the/p'test.txt#用grep-n'the'test.txt#输出test.txt的内容#文件检索带有'the'的行并显示行号nltest.txt|sed-n'4,/the/p'#Outputtest.txtcontent4linesafterthelinewith'the'withlinenumbersed-n'/the/='test.txt#输出'the'所在行的行号sed-n'/^PI/p'test.txt#找到'PI'开头的行输出sed-n'/[0-9]$/p'test.txt#查找以数字结尾的行输出grep'wood'test.txt#查找以'wood'结尾的行输出sed-n'/\/p'test.txt#输出行包含'wood',\<\>代表词边界2、删除符合条件的文本(d)#只删除输出流,不删除源文件nl命令用于计算该行的行数文件并显示内容nltest.txt|sed'3d'#删除第一行文本三行nltest.txt|sed'3,5d'#删除第三行文本到第五行nltest.txtlsed-n'/cross/p'#找到带'cross'的行输出行号为nltest.txtlsed'/cross/d'#删除带'cross'nltest.txlsed'/cross的行/!d'#!取反,保留'cross'sed'/^[a-z]/d'test.txt|nl#删除小写字母开头的行,结果显示行号sed'/^[a-z]/d'测试。txt#删除以小写字母开头的行sed-n'/\.$/d'test.txt#删除以.结尾的行sed'p'test.txt#输出所有内容sed'/^$/d'test.txt#删除空行sed'/.$/d'test.txt#删除任意字符结尾的行,相当于全部删除3.替换符合条件的文本使用sed命令替换时,需要使用s(stringReplace);c(整行/块替换);y(字符转换)命令选项sed's/the/THE/'test.txt#将每行第一个the替换为THEsed's/1/L/2'test.txt#将每行第二个1替换为lsed's/the/THE/g'test.txt#用THEsed的/o//g'test.txt#将文件中的全部替换掉??(替换为空字符串)sed的/^/#'test.txt#Insert#在每行的开头sed'/the/s/^/#/'test.txt#在每行包含First的地方插入#数字sed's/$/EOF/'test.txt#在最后插入字符串EOFofeachlinesed'3,5s/the/THE/g'test.txt#替换第3~5行中的所有forTHEsed'/the/s/o/0/g'test.txt#替换所有行中的o包含withO4,迁移符合条件的文本在使用sed命令迁移符合条件的文本时,经常用到以下参数:H:复制到剪贴板;g、G:覆盖/追加剪贴板中的数据到指定行w:另存为文件r:读取指定文件a:追加指定内容sed'/the/{H;d};$G'test.txt#将包含the的行迁移到文件末尾,{;}用于多次操作sed'1,5{H;d};17G'test.txt#将第1~5行的内容转移到第17行sed'/the/wout.file'test.txt#将包含的行保存为文件out.filesed'/the/r/etc/hostname'test。txt#将文件/etc/hostname的内容添加到包含sed的每一行'3aNew'test.txt#在第3行之后插入一个新行,内容为Newsed'/the/aNew'test.txt#插入一个新的每行后面的line,内容为Newsed'3aNew1\nNew2'test.txt#第三行后插入多行内容,中间的\n表示换行注意:\n和\r的区别:\n:linebreak是换行\r:回车,光标回到旧行的开头;5.使用脚本编辑文件使用sed脚本将多个编辑指令存储到文件中(每行一个编辑命令),使用“-f”选项调用。[root@client2~]#viopt.list#Createafile5H#里面是对sed5d16G的操作[root@client2~]#sed-fopt.listtest.txt#Operatetest.txt6.sed直接操作文件示例写一个脚本调整vsftpd服务配置,要求禁止匿名用户,允许本地用户[root@server2~]#useradddada[root@server2~]#passwddada[root@server2~]#useraddxiaoxiao[root@server2~]#passwdxiaoxiao[root@server2~]#viftp.sh#!/bin/bashA=vsftpdFTP=/etc/vsftpd/vsftpd.confyum-yinstall$Ased-i-e'/local_enable/s/NO/YES/g'$FTPsed-i-e'/write_enable/s/NO/YES/g'$FTPsed-i-e's/^#chroot_local_user=YES/chroot_local_user=YES/g'$FTPsed-i'$aallow_writeable_chroot=YES'$FTPsed-i-e'/listen/s/NO/YES/g'$FTPsed-i-e'/listen_ipv6/s/YES/NO/g'$FTPsystemctlstart$Anetstat-anpt|grep$A[root@server2~]#chmod+xftp.sh[root@server2~]#./ftp.sh在客户端安装ftp访问[root@server1~]#yum-yinstallftp[root@server1~]#ftp20.0.0.11Name(20.0.0.11:root):dadaftp>exit[root@server1~]#ftp20。0.0.11Name(20.0.0.11:root):xiaoxiaoftp>退出验证成功