linux 之sed命令详解

sed命令详解

sed是什么

sed是linux文本处理三剑客之一,全称 StreamEDitor,非常著名的行编辑器,功能十分强大。

sed的工作

sed处理文本时每次从文件复制出来一行,放在工作车间,又叫做模式空间,即pattern space,然后与模式进行匹配。如果复制出来的这一行不能被模式匹配到,就默认把这一行输出至标准输出(如果用户明确指定不输出也可以)。

如果能被模式匹配到,就对这行数据进行用户指定的编辑操作,编辑完成后可能输出至标准输出,也可能是用户指定的其他操作。这样第一行就处理完成,之后处理第二行,接着第三行等等。

除了模式空间外还有一个保持空间,hold space。这是一个让人又爱又恨的东西。sed会把编辑过的行数据保存至保持空间,进行一些非常高深复杂的操作。

sed命令的用法

sed命令模板:sed [OPTION]...  ‘script‘  [input-file] ...

为了给大家演示效果,我就用./fstab 给大家做演示,下面为文件的全部内容

[[email protected] ~]#cat fstab

/etc/fstab

UUID=2e454750-935b-4cfc-ae26-79fc6909d420/

8f6818579f1a4118b3eeedf97bdb1df2/usr

(1)sed常用选项

-n:不输出模式空间中的内容至屏幕;

[[email protected] ~]# sed -n ‘2p‘ fstab  --------p指显示匹配到的行,“-n”表示不显示没匹配到的行

UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /

-escript, --expression=script:多点编辑,每次可给出多条命令

[[email protected] ~]# sed -e ‘3d‘ -e ‘[email protected]@@g‘ fstab  删除第三行,并去掉全文的字符串“UUID”

/etc/fstab

=2e454750-935b-4cfc-ae26-79fc6909d420 /

注意,后面“-e”的命令执行是在前面的“-e”命令执行结果上实现的,如果前者删除了某一行,后者就不会再查找那一行了

[[email protected]~]# sed -e  ‘2d‘ -e ‘[email protected]@@g‘ fstab

/etc/fstab          -----------------------------前条命令删除了第二行,后者就匹配不到第二行了

8f6818579f1a4118b3eeedf97bdb1df2 /usr

-f /PATH/TO/SED_SCRIPT_FILE;从一个文件中读取命令,被读取的文件中每行可以编辑一个命令;

-r,--regexp-extended:支持使用扩展正则表达式;

[[email protected] ~]# sed -r ‘[email protected]^[email protected]@g‘ fstab  -----------删除文本中出现的UUID

/etc/fstab

=2e454750-935b-4cfc-ae26-79fc6909d420 /

8f6818579f1a4118b3eeedf97bdb1df2 /usr

-i[SUFFIX],--in-place[=SUFFIX]:直接编辑原文件;

[[email protected] ~]# sed -i ‘1,2d‘ fstab

[[email protected] ~]# cat fstab   -------------直接在文本中删除了指定行,非常有风险,不建议这样做

8f6818579f1a4118b3eeedf97bdb1df2 /usr

(2)地址定界

为了演示效果,我给文件增加了两行

[[email protected] ~]# cat fstab

/etc/fstab

UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /

good

func

8f6818579f1a4118b3eeedf97bdb1df2 /usr

空地址:对全文进行处理;

[[email protected] ~]# sed -i ‘d‘ fstab

[[email protected] ~]# cat fstab  ---------直接文本被清空了

[[email protected]~]#

地址:#指定行;例如3就是第三行,7就是第七行。

[[email protected] ~]# sed -n ‘3p‘ fstab -------- 只显示第三行

good

/pattern/:被此模式所匹配到的每一行;

[[email protected] ~]# sed -n ‘/UU/p‘ fstab  只显示出现“UU”的行

UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /

地址范

#,#:2,4,指第二行到第四行

[[email protected] ~]# sed ‘2,4d‘ fstab   删除2-4行

/etc/fstab

8f6818579f1a4118b3eeedf97bdb1df2 /usr

#,+#:2,+3,指从第2行到(2+3)行,即2-5行

[[email protected] ~]# sed -n ‘2,+3p‘ fstab

UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /

good

func

8f6818579f1a4118b3eeedf97bdb1df2 /usr

#,/pat1/:

[[email protected] ~]# sed -n ‘2,/fun/p‘ fstab  ----------从第一行到出现“fun”的行

UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /

good

func

/pat1/,/pat2/

[[email protected] ~]# sed -n ‘/U/,/fun/p‘ fstab  ---------从第一次出现“U”的行,到第一次出现“fun”的行

UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /

good

func

$:最后一行;

[[email protected] ~]# sed -n ‘$p‘ fstab ---只显示最后一行

8f6818579f1a4118b3eeedf97bdb1df2/usr

:~

1~2:,从第一行开始,每次走两行,即读一行读一行,指所有奇数行

[[email protected] ~]# sed -n ‘1~2p‘ fstab

/etc/fstab

good

8f6818579f1a4118b3eeedf97bdb1df2 /usr

2~2:从第二行开始,读一行跳一行,所有偶数行

[[email protected] ~]# sed -n ‘2~2p‘ fstab

UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /

func

还可以一次步进3行,4行等等

(3)编辑命令

d:删除匹配到的行,输出屏幕的是删除匹配到的行之后的结果。

[[email protected] ~]# sed ‘2,3d‘ fstab ----------删除2-3行,就只剩下第一行

/etc/fstab

p:显示模式空间中的内容;

[[email protected] ~]# sed ‘3p‘ fstab
/etc/fstab
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                       
8f6818579f1a4118b3eeedf97bdb1df2 /usr     --------模式空间匹配到的是第三行。默认输出一次,
8f6818579f1a4118b3eeedf97bdb1df2 /usr        -------------用“p又显示一次”,所以会显示两次
[[email protected] ~]# sed -n ‘3p‘ fstab    -----------加 “-n”只显示匹配到的行
8f6818579f1a4118b3eeedf97bdb1df2 /usr

a  \line:在行后面追加新行“line”,支持使用\n实现多行追加;

[[email protected] ~]# sed ‘2a \goodboy‘  fstab
/etc/fstab
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                       
goodboy            -------------------------在第二行的下方添加一行指定内容
8f6818579f1a4118b3eeedf97bdb1df2 /usr
[[email protected] ~]# sed ‘2a \goodboy\nprettygirl‘ fstab
/etc/fstab
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                       
goodboy      --------------用\n隔开多行
prettygirl
8f6818579f1a4118b3eeedf97bdb1df2 /usr

i \line:在指定行前面插入新行“line”,支持使用\n实现多行插入;

[[email protected] ~]# sed ‘3i \prettygirl‘ fstab
/etc/fstab
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                       
prettygirl
8f6818579f1a4118b3eeedf97bdb1df2 /usr

c  \line:把匹配到的行替换为此处指定的文本“line”;

[[email protected] ~]# sed ‘2c \you are fucking beautiful‘fstab
/etc/fstab
you are fucking beautiful   ----------------原来的第二行不见了,替代的是自己定义的新行
8f6818579f1a4118b3eeedf97bdb1df2 /usr

/PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;

[[email protected] ~]# sed ‘3w ./cat.r‘ fstab
/etc/fstab
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                       
8f6818579f1a4118b3eeedf97bdb1df2 /usr     
[[email protected] ~]# cat cat.r
8f6818579f1a4118b3eeedf97bdb1df2 /usr    --------是原文件的第三行

r  /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;

[[email protected] ~]# sed ‘1r ./func‘ fstab
/etc/fstab
stupid bird         -------------------这两行为func文件的内容,追加到第一行的下面
fool boy
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                       
8f6818579f1a4118b3eeedf97bdb1df2 /usr

=:为模式匹配到的行显示行号,号码显示在行的下方;

[[email protected] ~]# sed ‘2,3=‘ fstab
/etc/fstab
2
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                       
3
8f6818579f1a4118b3eeedf97bdb1df2 /usr

!:条件取反;地址定界!编辑命令;!写在地址定界与编辑命令中间

 [[email protected] ~]#sed ‘2!d‘ fstab  -----------取反后删除出第二行以外的行
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /       
[[email protected] ~]# sed ‘2d‘ fstab -----------删除第二行
/etc/fstab
8f6818579f1a4118b3eeedf97bdb1df2 /usr

(4)找替

s///:查找替换,其分隔符可自行指定,常用的有[email protected]@@, s###等;

[[email protected] ~]# sed ‘[email protected]^[email protected]&&&&@g‘fstab   ---------把出现的“UUID”替换成4个连续的“UUID”
/etc/fstab
UUIDUUIDUUIDUUID=2e454750-935b-4cfc-ae26-79fc6909d420/                       
8f6818579f1a4118b3eeedf97bdb1df2 /usr

替换标记:

g:全局替换;如上个例子所示,会查找并替换全文,否则只会替换被第一次匹配到的行

w/PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;

[[email protected] ~]# sed ‘[email protected]@[email protected] ./cat.r‘ fstab
/etc/fstab
UUID=2e454750-935b-4cfc-ae26-AAAAAAAfc6909d420 /                       
8f68185AAAAAAAf1a4118b3eeedf97bdb1df2 /usr     
[[email protected] ~]# cat cat.r    -----------文件cat.r 中只有替换成功的行,没替换的行没写进来
UUID=2e454750-935b-4cfc-ae26-AAAAAAAfc6909d420 /                       
8f68185AAAAAAAf1a4118b3eeedf97bdb1df2 /usr

p:显示替换成功的行;

[[email protected] ~]# sed -n ‘[email protected]@[email protected]‘ fstab  ------加“-n”表示只显示替换成功的行
UUID=2e454750-935b-4cfc-ae26-AAAAAAAfc6909d420 /                       
8f68185AAAAAAAf1a4118b3eeedf97bdb1df2 /usr

练习1:删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符;

[[email protected] ~]#sed  ‘[email protected]^[[:space:]]\[email protected]@‘ /etc/grub2.cfg

练习2:删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;

[[email protected] ~]#sed  ‘[email protected]^#[[:space:]]*@@‘  /etc/fstab

练习3:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;

[[email protected] ~]# echo"/etc/passwd" | sed -r ‘[email protected][^/]+/[email protected]@‘

[[email protected] ~]#echo "/var/log/messages/" | sed ‘[email protected][^/]\+/\[email protected]@‘

据说高级编辑命令只有智商超过240的人玩的,有兴趣的就自己看吧

级编辑命令

h:把模式空间中的内容覆盖至保持空间中;

H:把模式空间中的内容追加至保持空间中;

g:把保持空间中的内容覆盖至模式空间中;

G:把保持空间中的内容追加至模式空间中;

x:把模式空间中的内容与保持空间中的内容互换;

n:覆盖读取匹配到的行的下一行至模式空间中;

N:追加读取匹配到的行的下一行至模式空间中;

d:删除模式空间中的行;

D:删除多行模式空间中的所有行;

示例:

sed  -n ‘n;p‘  FILE:显示偶数行;

sed  ‘1!G;h;$!d‘ FILE:逆序显示文件的内容;与tac命令相同

sed  ’$!d‘  FILE:取出最后一行;同 “tail–n 1”

sed  ‘$!N;$!D‘ FILE:取出文件后两行;同 “tail–n 2”

sed ‘/^$/d;G‘FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;

sed  ‘n;d‘ FILE:显示奇数行;

sed ‘G‘ FILE:在原有的每行后方添加一个空白行;

时间: 2024-08-02 10:54:12

linux 之sed命令详解的相关文章

玩转LINUX之sed命令详解

Linux sed命令是利用script来处理文本文件. sed可依照script的指令,来处理.编辑文本文件. Sed主要用来自动编辑一个或多个文件:简化对文件的反复操作:编写转换程序等. 执行时,sed会从文件或者标准输入中读取一行,将其复制到缓冲区,对文本编辑完成之后,读取下一行直到所有的文本行都编辑完毕. 所以sed命令处理时只会改变缓冲区中文本的副本,如果想要直接编辑原文件,可以使用-i选项或者将结果重定向到新的文件中. sed命令的基本语法如下: # sed [options] co

linux之sed命令详解

sed是一个非交互式文本编辑器,它可以对文本文件和标准输入进行编辑,标准输入可以来自键盘输入,文件重定向,字符串,变量,或者是管道的文本.并将其复制到缓冲区,然后读取命令行的命令,对此命令要求的行号进行编辑. 用法: sed共有三种用法: ①直接在命令行中使用 sed [选项] 'sed命令' 输入文件 ②将sed命令写入脚本文件中,使用sed命令调用 sed [选项] -f sed脚本文件 输入文件 ③将sed命令写入脚本文件中,并设置为可执行 ./sed 脚本文件 输入文件 其中第③种的脚本

linux的sed命令详解

sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法 sed命令行格式为: sed [-nefri] 'command' 输入文本 常用选项: -n∶使用安静(silent)模式.在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上.但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来. -e∶直接在指令列模式上进行 sed 的动作编辑: -

linux下sed命令详解

sed:Stream Editor文本流编辑,sed是一个"非交互式的"面向字符流的编辑器.能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上.还可以对原文件改动,但是不会再屏幕上返回结果. sed命令的语法格式: sed的命令格式: sed [option] 'sed command'filename sed的脚本格式:sed [option] -f 'sed script'filename sed命令的选项(option):

Linux shell sed 命令详解

sed命令常见用途 查找关键词做全局替换 查找某行的关键词做替换 查找关键字所在行,并且执行指定关键字的替换 在某行之后追加 查找关键字,并且在第二行追加 删除包含关键字的行 查看指定的行 在最后一行追加 1. 查找关键词做全局替换 sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' /etc/ssh/sshd_config 2. 查找/etc/crontab 第17行,并且把0,30替换为15,45 sed -i '17s

2.2 linux sed命令详解

简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有 改变,除非你使用重定向存储输出.Sed主要用来自动编辑一个或多个文件:简化对文件的反复操作:编写转换程序等. sed使用参数 [[email protected] ~]# sed [-nefr] [动作] 选项与参数

文本处理工具之二 sed命令详解

======博主所学知识来着于恩师马哥的亲授====== 马哥教育"2014夏令营"开始啦!!!马哥教育是目前性价比最高的Linux培训,国内好评度排名第一,并被网友称为Linux界的"黄埔军校",全部课程采用Centos6.5x86_64讲解,经过几期网络班的总结和锤炼,逐渐完善的课程体系,学员学习进度监督和优质的考试系统检验学员掌握程度,活跃的在线答疑环节,名师陪伴,牛人指点,精彩不容错过. 详情猛戳:http://www.magedu.com/ 课程内容:ht

Linux 之Cut命令详解

摘自:http://blog.csdn.net/zsf8701/article/details/7718680 Linux 之Cut命令详解 cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的. (1)其语法格式为: cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file] 使用说明 cut 命令从文件的每一行剪切字节.字符和字段并将这些字节.字符和字段写至标准

(转)Linux下PS命令详解

(转)Linux下PS命令详解 整理自:http://blog.chinaunix.net/space.php?uid=20564848&do=blog&id=74654 要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps (1) ps :是显示瞬间进程的状态,并不动态连续: (2) top:如果想对进程运行时间监控,应该用 top 命令: (3) kill 用于杀死进程或者给进程发送信号: (4) 查看文章最后的man手册,可以查看ps的每项输出的含义