sed
Posted skyzy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sed相关的知识,希望对你有一定的参考价值。
文本编辑器: vi vim nano gedit emacs ... txt doc ... 以上编辑器的共同特点就是需要先将文件打开然后再去编辑;交互式的 sed(流编辑器|行编辑器):非交互式 1、通过非交互3去修改文件内容,默认情况,不会直接修改源文件 2、sed用来将文档或者字符串经过一系列的编辑命令转换成另外一种格式输入 3、sed通过用来匹配一个或者多个正则表达式来进行文本处理 sed工具有两种模式,命令模式|脚本模式 命令行模式: 格式: sed 选项 ‘命令清单[地址定位]‘ filename 说明:引用shell中的变量时,需要使用双引号 选项: -e:多次编辑处理 -n:取消默认输出 -f:指定sed的脚本文件 -r:使用扩展正则表达式 -i:直接修改源文件(谨慎使用) 命令清单: a或(a):在当前行后添加一行或多行 i或(i):在当前行前添加一行或多行 c或(c):用命令后的内容替换当前行的整行内容 sed ‘ahello world‘ filename---在每一行下面添加hello world sed ‘3ahello world‘ filename---在第3行下面添加hello world sed ‘1,3ahello world‘ filename---在第1~3行下面添加hello world sed ‘5ahello (ENTER键) world end‘ filname ---在第5行下面添加多行(hello为一行, world为另一行) sed ‘1,3i8888‘ filename---在第1~3行的上面添加8888 sed ‘/root/cuplooking‘ filename---将有root关键字的整行内容替换成uplooking sed ‘5caaaaa‘ filename ---将第5行的内容替换为aaaaa p:打印行 d:删除行 r:读取文件内容 w:将所选行写入文件 !:对所选行以外的行进行处理(取反) sed -n ‘1,3p‘ 1.txt ---将第1~3行打印出来 sed -n ‘/root/p‘ 1.txt ---将含有root的行打印出来 sed -n ‘$p‘ 1.txt ---将最后一行打印出来 sed -n ‘1,3!p‘ 1.txt ---将除了第1~3行以外的行打印出来 sed ‘1,5d‘ 1.txt---删除第1~5行 sed ‘/root/r/etc/hosts‘ 1.txt ---在有root关键字的行下面添加/etc/hosts文件内的内容 sed ‘/root/r /etc/hosts‘ 1.txt ---在有root关键字的行下面添加/etc/hosts文件内的内容 sed ‘5r /etc/hosts‘ 1.txt ---在第5行下面添加/etc/hosts文件内的内容 sed ‘1,5w 2.txt‘ 1.txt ---将第1~5行的内容另保存在2.txt文件中 sed ‘/root/w 2.txt‘ 1.txt ---将有root的行另保存在2.txt文件中 s:搜索替换 g:全局替换 sed -n ‘s/root/hello/p‘ 1.txt ---将有root行的第一个root替换为hello sed -n ‘5s/root/hello/p‘ 1.txt ---将第5行的第一个root替换为hello sed -n ‘s/root/hello/gp‘ 1.txt ----将所有的root替换为hello y:将字符替换成另一个字符(一对一),不能对正则应用y命令 类似tr &:保存查找字符串方便在替换中引用 =:打印行号 sed ‘y/root/ROOT/‘ 1.txt ----将文件内所有的r-->R , o-->O , t-->T sed ‘1,5y/root/ROOT/‘ 1.txt ----将文件内第1~5行的r-->R , o-->O , t-->T sed ‘1y/:/@/‘ 1.txt ---将第1行的:替换为@ sed -n ‘1,5s/^/#&/p‘ 1.txt ----在第1~5行的行首添加# sed -n ‘1,5s/^/#/p‘ 1.txt ----在第1~5行的行首添加# sed -n ‘1,5s/$/&#/p‘ 1.txt ----在第1~5行的行尾添加# sed -ne ‘/root/=‘ -ne ‘/root/p‘ 1.txt ----‘/root/=‘表示将有root关键字的行的行号打印 地址定位: x:指定x行 sed -n ‘2p‘ file x,y:指定x行到y行 sed -n ‘1,5p‘ file /key/:查找包含key关键字的行 sed -n ‘/root/p‘ file /key1/,/key2/:查找key1和key2关键字之间的行 sed -n ‘/root/,/ftp/p‘ file /key1/,x:匹配从关键字行开始到第x行之间的行 sed -n ‘/^root/,3p‘ file x,/key/:匹配从第x行开始到关键字的行 sed -n ‘5,/root/p‘ file x,y!:匹配从x行到y行以外的行 sed -n ‘1,5!p‘ file 脚本模式: demo1: #!/bin/sed s/stu/USER/ # vim xxx.sed ---> #!/bin/sed xxxxxx # sed -f xxx.sed file ----调用sed脚本 #!/bin/sed -f ---> xxx # ./xxx.sed filename ----调用sed脚本 1、sed脚本的内容就是一些命令清单 2、在每行的末尾不能有任何空格、制表符和其他文本 3、如果在一行中有多个命令,要用分号隔开 4、用#注释内容 总结: 1、sed匹配正则,正则必须要用"/xxx/"包起来 2、正则里有扩展正则,那么需要-r 3、组合使用 sed ‘/key/,+4d‘ file 删除从匹配字符串key开始到其后的4行为止的行 sed ‘/key/,~3d‘ file 删除从匹配字符串key开始到3的倍数行 sed ‘1~2d‘ 删除文件的奇数行 sed ‘0~2d‘ 删除文件的偶数行 sed ‘1~5d‘ 每隔5行删除一次(删除第1,6,11,16,21,26......) sed ‘0~5d‘ 每隔5行删除一次(删除第5,10,15,20,......) 练习: 1、将文件中任意数字替换成空或者制表符 sed -n ‘s/[0-9]//gp‘ sed -n ‘s/[0-9]/ /gp‘ 2、去掉文件1-5行的数字、冒号、斜杠 sed -nr ‘1,5s/[0-9]|:|///gp‘ sed -n ‘1,5s/[0-9:/]//gp‘ 3、匹配root关键字的行替换成hello abc,并保存到test.txt文件中 sed -n ‘s/root/hello acc/gp‘ sed -ne ‘/root/chello abc‘ passwd |sed -ne ‘w 123.txt‘ sed -ne ‘/root/chello abc‘ passwd |tee 123.txt sed ‘s/root/hello abc/gw test.txt‘ 4、删除vsftpd.conf、smb.conf、man.cf配置文件中所有注释掉的行(只保留有用的行),不要直接修改源文件 sed -r ‘/^#|^$/d‘ sed -n ‘/#/!p‘ sed -nr ‘/#|^$/!p‘ sed -r ‘/^#|^;|^$|^ $/d‘ sed -e ‘/^#/d;/^;/d;/^$/d;/^ $/d‘ sed -nr ‘/#|;|^$/!p‘ sed -r ‘/^#|^$|^ $/d‘ sed -nr ‘/#|./!p‘ 5、使用sed命令截取自己的ip地址 ifconfig|sed -n ‘/Bcast/p‘|grep -o -P ‘d+.d+.d+.d+‘|sed -n ‘1p‘ ifconfig eth0|grep Bcast|sed -n ‘s/.*inet addr:(.*) Bcast.*/1/p‘ ifconfig eth0|grep Bcast|sed -n ‘s/.*inet addr://gp‘|sed -n ‘s/Bcast.*//gp‘ 6、截取除自己的ip、广播、子网掩码,显示如下: IP地址是: 广播地址是: 子网掩码是: ifconfig eth0|grep Bcast|sed -n ‘s/.*inet addr:(.*) Bcast:(.*) Mask:(.*)/IP地址是:1 广播地址是:2 子网掩码是:3/p‘ (#ifconfig|sed -n ‘/Bcast/p‘|grep -o -P ‘d+.d+.d+.d+‘) 7、注释掉文件的2-3行和匹配到以root开头或者以ftp开头的行 sed -ne ‘2,3s/^/#&/p‘ -nre ‘s/^root|^ftp/#&/p‘ sed -ne ‘2,3s/^/#/gp‘ -nre ‘s/^root|^ftp/#&/p‘ 练习: 1、写一个初始化系统的脚本 1> 自动修改主机名(如:IP是10.1.1.10,则主机名改为server10.uplook.com) 2> 自动配置可用的yum源 3> 自动关闭防火墙和selinux 2、写一个自动搭建ftp服务的脚本,要求如下: 1> 不支持本地用户登录 2> 匿名用户可以上传、新建、删除 3> 匿名用户的限速为500kbps 1. #!/bin/bash #初始化系统脚本 #自动修改主机名函数 initHostName(){ IP=`ifconfig|grep -oP "(d+.){3}d+"|sed -n ‘1p‘` NUM=`echo $IP|cut -d"." -f4` sed -i "/HOSTNAME/cserver$NUM.uplook.com" /etc/sysconfig/network echo "initHostName finished." } #自动配置yum源 Yum(){ echo "虚拟机必须要开启共享文件夹" [ ! -e /yum ] && mkdir /yum mount -o loop /mnt/hgfs/soft/rhel-server-6.5-x86_64-dvd.iso /yum rm -rf /etc/yum.repos.d/* touch /etc/yum.repos.d/server.repo cat >>/etc/yum.repos.d/server.repo<以上是关于sed的主要内容,如果未能解决你的问题,请参考以下文章