Shell(二)sed命令

################人生最大的幸福就是干自己喜欢的事,此刻我就很幸福################

问题1什么是sed

问题2sed的作用

###########################################################################

(1)基本概念

         sed是一种编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的存储在临时缓冲区中,称为模式空间(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾,文件内容并没有改变除非你使用重定向存储输出。

         特点:模式空间内容(实际只有一行)用sed命令处理,然后标准输出,接着将下一行内容读进模式空间进而处理

         作用:sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。

辩证sed -i与ed的区别ed的再研究

ed编辑器,它将整个文件一次性的读入自己的缓冲区,对该副本执行指定的操作,并可选地将缓冲区写到磁盘!

(2)sed命令的常用语法

sed的命令格式: sed [option] 'sed command'filename

sed的脚本格式: sed [option] -f|e 'sed script'filename

(3)sed命令常用的option(参数)

-n :只打印模式匹配的行

备注:由于没有被sed命令处理的行,默认也会出现在控制台,而我们只想得到被sed命令处理过的行内容,需要-n的参数

注意:如果是删除(d)命令的时候,标准输出就是所需要的,所以此时不需要加-n,不然没有任何输出!

###############

-e :直接在命令行模式上进行sed动作编辑(edit-->编辑文件才能用),此为默认选项;或者脚本

说明:表示重编辑选项

sed '2,$d' /etc/passwd |sed 's#root#wzj#g'

# wzj:x:0:0:wzj:/wzj:/bin/bash

sed -e '2,$d' /etc/passwd -e 's#root#wzj#g'

# wzj:x:0:0:wzj:/wzj:/bin/bash

###############

-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作

###############

-r :支持扩展表达式明确哪些扩展

理解:就是grep的扩展egrep的形式!

###############

-i 直接修改文件内容,要慎重

###################################

练习1n参数的说明

说明:体会加不加n的区别!

练习2:e参数的说明

 测试:加了-e可以在同一行里执行多条命令

说明:在前一个command命令的处理的基础上再进行处理!

练习3i参数的说明

        对比实验1:i参数重定向自身

说明:流编辑器与ed编辑器的区别,sed编辑器是一次读取一行一行到内存,所以空无一物

        对比实验2:i参数重定向非文件本身

练习4f参数的说明

说明:文件名随便起,没有特殊的含义!

小发现:如果以sed为后缀名,竟然会有语法校验,侧面印证了sed也可以作为独立的脚本

sed的官网

(3)sed的动作命令

    a :追加(append), a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行);多行内容呢?
    c :取代(change), c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
    d :删除(delete), 模式删除,d后面通常不接任何咚咚;
    i :插入(insert), i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)!
    p :打印(print),    即将某个选择的数据印出,通常 p 会与参数 sed -n 一起运行!
    s :替换(substitue),通常这个s的动作可以搭配正规表示法(比较重要)!
    n :读如下一行输入行,从下一行进行处理
    ! :取反

# 用法 number+[a,i,c,d]等

s--->替换标记

 g:全局替换;
 w /file:将替换的结果保存至指定文件中;sed -i 's/pattern/replaces/w my.txt'  test    将替换后的结果保存到my.txt中
 p:显示替换成功的行;

(4)需求

#########分割1############

需求1:在文件中查询文本

语法/pattern {sed-commands}

相关参数pn

# 取最后一行
sed -n '$p' /etc/passwd

tail -n1 /etc/passwd

补充:查询到了,用sed的command命令作进一步的处理!

需求2:将root替换成Java

说明注意{}块的骚操作

备注:其实应该经常使用的是模式查找涉及正则表达式

模式的类型

        解释:所有在模板root和lp所确定的范围内的行都被打印;

        细节:如果root出现在lp后面的行中,从root开始到下一个lp,无论这个lp出现在哪里,二者之间的行都被打印;

        接上:如果从root开始到文件的末尾还没有出现lp,那么从root到末尾的所有行都将打印

补充

说明:"!"表示后面的命令对所有没有被选定的行发生作用,反向选择

sed -n '/^$/!p' fstab   # 打印不是空行的行-->"/^$/!"是一个模式!

备注$表示最后一行

# 打印匹配该模式的行号   nl passwd|sed -n '/root/='

  需求奇偶行打印

等价方式

说明:从第1行开始,~number表示步长

需求:只将第一个root替换成wzj,然后退出

# sed '/root/{s/root/wzj/;q}' passwd

说明:多个命令即可以用-e来连接也可以用;来连接!

过程:当模板root在某一行被匹配,替换命令首先将root替换为wzj,然后再用q退出sed

#########分割2############

需求2替换文件的内容

核心:模式查找

替换标记

 g:全局替换--->如果一行有多个匹配的模式,而需要全部改变,则必须加上该参数,否则只替换第一个匹配。
 w:将替换的结果保存至指定文件中;
 p:显示替换成功的行;
 n:读取下一个输入行,用下一个命令处理新的行而不是用第一个命令;
 P:打印pattern space中的第一行;
 q:退出sed;

        说明:因为不可能记住所有的特殊字符,为了避免特殊字符的转义,可以自定义。

        s后面的字符一定是分隔搜索字符串替换字符串分隔符默认为斜杠"/",但是在s命令使用的情况下可以改变。不论什么字符紧跟着s命令都认为是新的分隔符。

       应用场景:这个技术在搜索反斜杠的模板时非常有用,例如搜索时间和路径的时候      

sed 's@root@wzj@g' passwd

#########分割3############

需求3:追加文件的内容

明确:2可以换成模式

说明:追加当前行的下一行,可以通过\n特殊的字符进行换行!

#########分割4##########

需求:c改变文件的行内容

对比:c(change)是模式匹配行的替换,而不是行的局部数据,而s是行的局部数据的变化!

#########分割5##########

需求:删除(d)的操作

sed '/^$/d' fstab --->删除空行
sed '1,4d' fstab  --->删除1,4行

说明:是模式匹配后删除行

#########分割6##########

i的参数同上--->略过!

#########分割7##########

sed 'G' file   ---->每一行的下面出现一个空行

sed '$!G' file ---->每一行的上面出现一个空行

 

相关命令的参考

很不错的文章

带图形的参考

说明:与vim很相似

sed的一些其它需求

sed '2,5d'  将第 2~5 行删除
sed '2d'  只要删除第 2 行
sed '3,$d'  要删除第 3 到最后一行
sed '2a drink tea' 在第二行后(亦即是加在第三行)加上『drink tea?』字
sed '2i drink tea' 在第二行前
sed -n '5,7p' 第 5-7 行或sed -n 5~7p
sed -n '/root/p'  使用-n的时候将只打印包含模板的行。
sed  '/root/d'   删除/etc/passwd所有包含root的行,其他行输出
sed 's/要被取代的字串/新的字串/g'
sed -i 's/\.$/\!/g' regular_express.txt  利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成!
sed -i 's/\(.\)\{6\}$//'  domain.txt   去掉每行后的6个字符
sed 's/.\{6\}//' file    去掉每行的前6个字符
sed 's/^/ 255.255.255.0 /g' /etc/passwd  每行开头添加字段
sed 's/&/ 255.255.255.0 /g' /etc/passwd  每行结尾添加字段
sed -e 4a\newLine testfile   在第四行插入新行
sed -n '5,/northeast/p' sed.txt 从第五行开始打印匹配的字符 
sed -e '1,3d' -e 's/Hemenway/Jones/' sed.txt   -e  执行多个编辑任务
sed '/eastern/i Hello,World! \> -----------------------------------' sed.txt  i   插入
sed 's#^.*am \([a-z].*\) tea.*$#\1#g' test.txt   只保留想要的部分
stat /etc|sed -n 's#^.*(0\([0-7].*\)\/-.*$#\1#gp'  
stat /etc|sed -n '4p'|awk -F '[(/]' '{print $2}
sed -e 's#[()]##g'  取括号中的内容
sed s/[[:space:]]//g  去掉空格
sed -i "/^\s*$/d" a.rb 删除空行
sed -i -c -e '/^#/d' config_file sed去除注释行
sed -i -c -e '/^$/d' config_file sed去除空行
sed -i -c -e '/^$/d;/^#/' config_file sed去空行和注释行
cat app3.txt |tr 'A-Z' 'a-z'|sed 's/$/*/g' 大小写转换并在后面添加*号

应用汇总

(1)selinux的替换

# 对指定的行进行替换!-->/etc/sysconfig/selinux出现的问题!

sed -i '7c SELINUX=enforcing' /etc/selinux/config
# 正则匹配进行替换

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

sed -ir '/^SELINUX/c SELINUX=disabled/g' /etc/selinux/config

# 注意:sed –i会破坏原有文件的的软链接或硬链接--最好修改源文件,不是链接文件

教训:当你用sed –i来修改文件时,一定要修改源文件,千万不要修改它的硬链接或者软链接文件。防止破坏链接文件后,自己还一无所知

细节补充

(2)非交互式的修改指定的配置文件

ssh不做DNS不解析

# 该模式进行替换,替换的内容,以前就是(7c-->第7行替换)

sed -i '/UseDNS/cUserDNS no' /etc/ssh/sshd_config

(3)清空

sed -i '1,$d' /etc/passwd # 要知道如何恢复!

> /etc/passwd

(4)将匹配的行写入到文件中

# 模式空间的重定向-->将某些信息保留!

sed '/root/w my.txt' /etc/passwd

(5)后向引用

# 获取网卡的IP-->后向引用,两部分(注意:-r参数)

ifconfig eth0|sed -n 2p |sed -r 's#^.*net (.*)(net.*$)#\1#g'

# 说明:最好将#换成/,不用转义了!

(6)删除配置文件中#开头的注释行,如果碰到tab或者空格的行是无法删除

# 把有#号或者有Tab键的删除了-->总之该行有#号

# 任意空格加上#

sed -r '/^[ \t]*#/d' /etc/selinux/config

# 实际用的是egrep

(7)删除无内容的空行

sed -r '/^[ \t]*$/d' /etc/selinux/config

# 以任意空格开头和结束,实际用egrep

(8)删除注释行和空行

# 扩展字符

sed -r '/^[ \t]*($|#)/d' /etc/httpd/conf/httpd.conf

(9)给文件行加上注释信息

场景:文件里面有很多定时任务(脚本),执行完了,主要注释掉,过滤自己的脚本

# 先过滤自己的脚本!

# 模式-->操作

sed  -i '/root/s#^#\##g' /etc/crontab

# nginx.conf的配置文件!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值