当前位置: 首页 > Linux

linuxsed命令详解

时间:2023-04-06 19:07:46 Linux

LinuxsedStreamEDitor,非交互式流编辑器,基于模式匹配的考虑和修改后的文件逐行处理,并将结果输出到屏幕,说明文字输出,删除,替换,复制、剪切、导入、导出等操作1、基本正则表达式和扩展正则表达式列表按照发布时间分为基本正则表达式和扩展正则表达式。Extendedregex在基本regex的基础上做了一些优化,增加了一些正则表达式符号,因为有些命令没有及时更新,所以你可能会遇到有些命令只支持基本正则表达式,不支持扩展正则表达式,或者你需要添加一些支持扩展正则表达式的选项。关于正则和扩展正则的区别的详细介绍可以看我的另一篇shell正则介绍。用法二:sed[option]'conditionalinstruction'file....相关指令如下:条件可以是行号或者/regular/nocondition,默认是所有条件指令可以增删改查等指令默认sed会打印出所有的输出内容,可以使用-n屏蔽默认输出选项,可以使用-r选项让sed支持扩展的常规sed命令常用选项如下:-n屏蔽了默认输出,默认sed会输出read文件的全部内容-r让sed支持扩展正则化如果和其他选项一起使用,优先考虑一个sed可以执行多条指令常用的sed命令的条件指令如下d:删除指定字符p:显示指定行s:替换指定字符i:在指定行前插入文本a:在指定行后追加文本c:替换指定行r:读取文件w:保存到文件3.知道sed工具的n,r,i选项命令\#sed[option]'条件命令'文件....我们可以把上面的条件命令拆解成#sed[options]'scoping+operatinginstructions'files....这样比较好理解sed-n'/bash$/s/:.*//p'/etc/passwd//OPTIONS-nrangedefinition/bash$/+操作说明s/:.*//psed命令可以使用行号或者正则作为条件匹配:1)当sed命令的-n选项进行p打印等过滤操作时,要看到的是符合条件的文本.但不使用选项时,默认将原文一起输出,干扰过滤效果。例如,尝试使用sed输出/etc/hosts的第一行:[root@server~]#sed'1p'/etc/hosts127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4127.0.0.1localhostlocalhost。localdomainlocalhost4localhost4.localdomain4::1localhostlocalhost.localdomainlocalhost6localhost6.localdomain6可以发现所有的行都显示了(第1行重复了2次)。——正确的用法应该加上-n选项,这样才能只显示第一行:[root@server~]#sed-n'1p'/etc/hosts127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4。localdomain4行号可以是连续的行号,比如打印passwd的账号信息第3到6行:[root@server~]#sed-n'3,6p'/etc/passwdbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin2)当sed命令的-r选项需要使用扩展正则表达式时,需要加上-r选项[root@server~]#sed-r's/bash|nologin/xxxx/g''/etc/passwd//将所有的bash或nologin换成xxxx3)sed命令的-i选项一般情况下sed命令所做的处理只是输出运行结果(包括打印、删除等)到当前终端屏幕,而不对原始文件做任何更改:[root@server~]#sed'd'/etc/passwd//deletealllines[root@server~]#cat/etc/passwd//查看原文,和Unmodified如果想直接修改文件内容,应该加上选项-i。需要注意的是,一些命令的组合和使用顺序会对最终输出产生影响。例如:command-n,并运行p[root@server~]#sed-in's/2017/xxx/'test.txt//i后面的n不影响结果[root@server~]#cattest.txxxxx20112018xxx20172024xxx20172017[root@server~]#sed-ni's/2017/xxx/'test.txt//n在i前面因为n已经屏蔽了所有显示,结果为空[root@server~]#cattest.txt[root@server~r]#sed-in's/2018$/xxx/p'test.txt//n在i后面的结果不影响结果,但是P后面的显示命令导致重复显示并写入文件的匹配项目。p'test.txt#n在i前面,P命令只将匹配项写入文件[root@server~]#cattest.txt20172011xxx例如直接删除test.txt的第一部分(创建一个任意内容的文件)第1~4行:[root@server~]#sed-i'1,4d'test.txt//删除操作[root@server~]#cattest.txt//确认删除result下面是关于使用sed修改文件的例子,为了避免练习过程中误操作导致系统故障,命令省略了-i选项,不再一一说明。如果需要,您可以添加此选项。4)多个命令可以用分号隔开用分号隔开多个操作,例如:[root@server~]#sed-n'1p;4p'/etc/passwdroot:x:0:0:root:/root:/bin/bashadm:x:3:4:adm:/var/adm:/sbin/nologin1)行号大小写打印第3行:[root@server~]#sed-n'3p'/etc/passwd打印第3行到5:[root@server~]#sed-n'3,5p'/etc/passwd打印第3行和第5行:[root@server~]#sed-n'3,5p'/etc/passwd打印第3行以下10行:[root@server~]#sed-n'3,+10p'/etc/passwd打印奇数行:[root@server~]#sed-n'1~2p'/etc/passwd打印偶数行-numberedlines:[root@server~]#sed-n'2~2p'/etc/passwd2)常规大小写打印包含root的行:[root@server~]#sed-n'/root/p'/etc/passwd打印bash末尾的行:[root@server~]#sed-n'/bash$/p'/etc/passwd3)如果没有条件,则表示匹配所有行[root@server~]#sed-n'p'/etc/passwd4.认识sed工具的p,d,s条件指令1)先看看sed工具的p指令案例集(自己生成一个a.txt文件在advance)[root@server~]#sed-n'p'a.txt//输出所有行,相当于cata.txt[root@server~]#sed-n'4p'a.txt//输出4thline[root@server~]#sed-n'4,7p'a.txt//输出第4~7行[root@server~]#sed-n'4,+10p'a.txt//输出行4及以下10行内容[root@server~]#sed-n'/^bin/p'a.txt//输出以bin开头Line[root@server~]#sed-n'$='a.txt//输出文件的行数2)我们看一下sed工具的d命令案例集(生成一个a.txt文件自己提前)[root@server~]#sed'3,5d'a.txt//删除第3~5行[root@server~]#sed'/xml/d'a.txt//删除所有包含的行xml[root@server~]#sed'/xml/!d'a.txt//删除不包含xml的行,**!符号表示否定**[root@server~]#sed'/^install/d'a.txt//删除以install开头的行[root@server~]#sed'$d'a.txt//删除文件最后一行[root@server~]#sed'/^$/d'a.txt//删除所有空行3)用sed命令替换s的基本功能(s/oldcontent/newcontent/option):[root@svr5~]#vimtest.txt//newmaterial201720112018201720172024201720172017[root@server~]#sed's/2017/xxxx/'test.txt//将每行的第一个2017换成xxxx[root@server~]#sed's/2017/xxxx/g'test.txt//每行全部将2017换成xxxx[root@server~]#sed's/2017/xxxx/2'test.txt//Replacethesecond2017ineachlinewithxxxx[root@server~]#sed's/2017//2'test.txt//删除每行第二个2017[root@server~]#sed-n's/2017/xxxx/p'test.txt//将每一行中的第一个2017替换为xxxx并显示4)我们看一下sed工具的s指令案例集(生成一个a.txt文件)注意:替换操作的分隔符“/”可以换成其他字符,如#、&等,方便修改文件路径[root@server~]#sed的/xml/XML/'a.txt//将每行第一个xml替换为XML[root@server~]#sed's/xml/XML/3'a.txt//将每行第三个xml替换为XML[root@server~]#sed's/xml/XML/g'a.txt//用XML替换所有xml[root@server~]#sed's/xml//g'a.txt//替换all删除所有xml文件(替换为空字符串)[root@server~]#sed's#/bin/bash#/sbin/sh#'a.txt//将/bin/bash替换为/sbin/sh[root@server~]#sed'4,7s/^/#/'a.txt//注释掉第4~7行(在行首添加#)[root@server~]#sed's/^#an/an/'a.txt//取消注释以#an开头的行(去掉行首的#)以下操作使用nssw.txt作为测试文件参考数据文件内容如下:[root@server~]#catnssw.txtHellotheworldnihaomabeijing5)删除文件中每行的第二个和最后一个字符并替换两次,第一次替换secondcharacter字符,第二次替换最后一个字符:[root@server~]#sed's/.//2;s/.$//'nssw.txt6)替换文件中每一行的第一个和最后一个字符第一个字符被交换。将每行文本拆分为“第一个字符”、“中间所有字符”、“倒数第二个字符”三部分,然后通过对“3-2-1”的替换操作按顺序重新排列:[root@server~]#sed-r's/^(.)(.*)(.)$/\3\2\1/'nssw.txt7)删除??文件中的所有数字,因为原文件中有没有数字,行首也没有空格。这里在内容中添加一些数字,在新的内容行的第一行添加几行空格,生成一个新的测试文件nssw2.txt[root@server~]#sed's/[0-9]//'nssw.txt//无效,因为它不包含数字。以nssw2.txt文件为例。删除行首所有数字和空格的操作如下:[root@server~]#sed-r's/[0-9]//g;s/^()+//'nssw2.txt8)文件中每个大写字母加上括号[]使用“()”实现保留功能,可参考如下操作解决:[root@server~]#sed-r's/([A-Z])/[\1]/g'nssw.txt五、认识sed工具的i,a,c条件指令\#sed[option]'conditionCommand'file..多行文本处理操作sed工具:i:在指定行前插入文本a:在指定行后追加文本c:替换指定行基本语法格式case:[root@server~]#sed'2aXX'a.txt//Afterthe第二行,添加XX[root@server~]#sed'2iXX'a.txt//在第二行前面,插入XX[root@server~]#sed'2cXX'a.txt//替换第二行XX1)在sed命令的第i指定行之前插入基本函数[root@server~]#sed'2ixxxx'nssw.txt//在第二行前插入xxxx[root@server~]#sed'cxxxx'nssw.txt//在所有行前插入xxxx2)在sed命令中加入a的基本功能[root@server~]#sed'3axxxx'nssw.txt//在第三行之后添加xxxx[root@server~]#sed'axxxx'nssw.txt//在所有行之后添加xxxx3)c替换sedcommand基本功能[root@server~]#sed'1cxxxx'nssw.txt//将第一行替换为xxxx[root@server~]#sed'cxxxx'nssw.txt//将所有行替换为xxx[root@server~]#sed'1,3cxxxx'nssw.txt//将1到3行替换为xxx6.了解sed的高级应用r,w条件指令新建文件a.txtn.txt[root@serversed]#cata.txtaabbccddeeffggghhiijjkkll[root@serversed]#catn.txt1122334455667788990011221)sed命令的r读取文件[root@serversed]#sed'2ra.txt'n.txt\\在第二行上插入a.txt1122234455667788aabbccddeeffggghhiijjkkll99001122[root@serverserve]#sed'1,3rn.txt'a.txt\\Insertn.txtbelow1to3linesrespectively)2)将sed命令的w保存到文件[root@serversed]#sed-n'1,3wc.txt'a.txt\\将1到3主存储为新文件c.txt[root@serversed]#catc.txtaabbccddeeffggghhiijjkkll[root@serversed]#sed-n'/^ii/wd.txt'a.txt\\将ii开头的行保存为d.txt[root@serversed]#catd.txtiijjkkll七。综合案例一)综合案例一[root@serversed]#cp/etc/passwd.[root@serversed]#nl/etc/passwd|sed'2,5d'//**删除2到5行|在pipe后使用-i选项无效**[root@serversed]#nlpasswd|sed'3,$d'//删除3到最后一行[root@serversed]#nlpasswd|sed'2ihostfile'>passwd.new//在第2行之前插入''hostfile''并生成一个新文件passwd.new[root@serversed]#nlpasswd|sed-n'/root/p'//显示包含root的行[root@serversed]#nl/etc/passwd|sed'/root/{s/bash/black/;p;q}'//花括号中的一组命令,每条命令之间用分号隔开,找到根行,将bash替换成clackp输出显示q是退出[root@serversed]#ifconfigeth0|grep'inet'|sed's/inet\s//g'|sed's/\snetmask.*$//g'\\获取本机IP地址其中\s表示匹配空格[root@serversed]#sed-e'3,$d'-e's/bash/blueshell/'passwd//多点编辑一个sed命令,删除第三行到/etc/passwd末尾的数据,替换bashwithblueshellroot:x:0:0:root:/root:/bin/blueshellbin:x:1:1:bin:/bin:/sbin/nologin2)综合案例二脚本应用本案例需要编写脚本getupwd。sh满足以下要求:找到使用bash作为登录shell的本地用户,根据每一行“用户名-->密码记录”,列出这些用户的shadow密码记录,保存到getupwd.log中基本思路如下:首先使用sed工具取出登录shell为/bin/的bash用户记录保存为临时文件/tmp/urec.tmp,计算记录条数,结合while循环遍历得到的账户记录,及逐行处理。对于每一行用户记录,通过切割开头和结尾得到用户名。,密码字符串按照指定的格式追加到/tmp/getuupwd.log文件中。循环结束后,删除临时文件并上报分析结果。脚本编写第一步:编写getupwd.sh脚本[root@serversed]#catgetupwd.sh#!/bin/bashA=$(sed-n'/bash$/s/:.*//p'/etc/passwd)##为$A中的i提取符合条件的账户记录##遍历账户记录dopass1=$(grep$i/etc/shadow)##在对应账号shadow中搜索这一行pass2=${pass1#*:}pass=${pass2%%:*}##拦截密码echo"$i-->$pass"done[root@serversed]#./getupwd.shroot-->$6$SAyc777Q$DgGi7Pnln0or.Ds04oyL6Y.QnVlMgZDRHMKKICJhiUAHBy4lvziPAZoW0MJz81xYonskLozvzhvNa4H59ngSl1nginx-->!!bigyong-->!!kaka5-->$6$uyZDpbUl$.CjkBefPZHXrRTcKc1csv7ZbbhHMMD4oQmum9lajJ1ot9at6fmIey5AE4kmUSoaWE/ofmFxyP2Dc6PAcczXdw0harry-->!!