根据鸟哥书籍学习 sed 工具的使用

简介:

sed工具

[root@localhost ~]#sed   [-nefr]  [动作]

参数:

-n  : 使用安静模式。在一般sed用法中,所有来自STDIN的数据一般都会列出到屏幕上。但是如果加上-n参数后,则只有经过sed特殊处理的那一行(操作)才会被列出来。

-e  :直接在命令行模式上进行sed的动作编辑。

-f  :直接将sed的动作写在一个文件内,-f filename 则可以执行filename内的动作。

-r  :  sed的动作支持的是扩展型正则表达式的语法(默认是基础正则表达式语法)。

-i  :  直接修改读取的文件内容,而不是由屏幕输出。

动作说明: [n1 [,n2]]  function 

n1 , n2 : 不见得会存在,一般代表选择进行动作的行数,举例来说,如果我的动作是需要在10到20行之间进行的,则“10,20 [动作行为]”


function有下面这些参数:

a   :新增,a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)

c   :替换,c后面可以接字符串,这些字符串可以替换n1,n2之间的行!

d   :删除,因为是删除,所以d后面通常不接任何参数。

i    :插入,i后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)。

p    :打印,也就是将某个选择的数据打印出来。通常p会与参数sed –n 一起运行。

s    :替换,可以直接进行替换工作。通常这个s的动作可以搭配正则表达式!



以行为单位的新增/删除功能

范例一:将passwd的内容列出并且打印行号,同时将2~5行删除。

[root@localhost opt]# nl passwd

     1 root:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

     4 adm:x:3:4:adm:/var/adm:/sbin/nologin

     5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

     6 sync:x:5:0:sync:/sbin:/bin/sync

     7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     8 halt:x:7:0:halt:/sbin:/sbin/halt

[root@localhost opt]# nl passwd | sed '2,5d'

     1 root:x:0:0:root:/root:/bin/bash

     6 sync:x:5:0:sync:/sbin:/bin/sync

     7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     8 halt:x:7:0:halt:/sbin:/sbin/halt

     9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

[root@localhost opt]# nl passwd | sed '4,$d'

     1 root:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

sed后面接的动作,请务必以’’两个单引号括住。

如果题型变化,举例来说,如果只要删除第2行,可以使用nl passwd | sed ‘2d’来完成,至于若要删除第3行到最后一行,则是nl passwd | sed ‘3,$d’,那个¥代表最后一行。

范例二:在第二行(即加在第三行)加上“drink tea?”字样!

[root@localhost opt]# nl passwd|sed '2a drink tea?'

     1 root:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

drink tea?

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

     4 adm:x:3:4:adm:/var/adm:/sbin/nologin

在a后面加上的字符串已经出现在第2行后面。如果要加在第2行前面呢,nl passwd| sed ‘2i drink tea?’

[root@localhost opt]# nl passwd | sed '2i drink tea?'

     1 root:x:0:0:root:/root:/bin/bash

drink tea?

     2 bin:x:1:1:bin:/bin:/sbin/nologin

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

     4 adm:x:3:4:adm:/var/adm:/sbin/nologin

增加一行很简单,那如果是要增加两行以上呢。

范例三:在第二行后面加入两行字,例如“drink tea or …….”与”drink beer?”

[root@localhost opt]# nl passwd | sed '2a drink tea ......\

> drink beer'

     1 root:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

drink tea ......

drink beer

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

     4 adm:x:3:4:adm:/var/adm:/sbin/nologin

这个范例的重点是我们可以新增不只一行,可以新增加好几行,但是每一行之间都必须以反斜杠“\”来进行新行的增加。所以,我们发现在第一行的后面就有\存在,那是一定要的。

以行为单位的替换与显示功能

范例四:将2-5行的内容替换为“no 2-5 number”

[root@localhost opt]# nl passwd | sed '2,5c no number'

     1 root:x:0:0:root:/root:/bin/bash

no number

     6 sync:x:5:0:sync:/sbin:/bin/sync

     7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     8 halt:x:7:0:halt:/sbin:/sbin/halt

通过这个方法我们就能够将数据整行替换了。我们以前想要列出第11-20行,要通过head –n 20 |tail –n 10 之类的方法来处理,很麻烦。sed则可以简单直接取出想要的几行看看下面的例子。

范例五:仅列出passwd文件内的第5-7行

[root@localhost opt]# nl passwd | sed -n '5,7p'

     5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

     6 sync:x:5:0:sync:/sbin:/bin/sync

     7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

上述命令中有个重要的参数-n,按照说明文件,这个-n代表的是“安静模式”!那么为什么要使用安静模式呢?你可以自行执行sed ‘5,7p’就知道了(5-7行会重复输出)。与没有加上-n的参数时,输出的数据可是差很多呢。你可以通过这个sed的以行为单位的显示功能,就能将某个文件内的某些行号查出来。

[root@localhost opt]# nl passwd | sed  '5,7p'

     1 root:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

     4 adm:x:3:4:adm:/var/adm:/sbin/nologin

     5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

     5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

     6 sync:x:5:0:sync:/sbin:/bin/sync

     6 sync:x:5:0:sync:/sbin:/bin/sync

     7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     8 halt:x:7:0:halt:/sbin:/sbin/halt

     9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

部分数据的查找并替换功能

   除了整行的处理模式之外,sed还可以用行为单位进行部分数据的查找并替换功能。基本上sed的查找与替换和vi非常类似,他有点像这样:

sed ‘s/要被替换的字符串/新的字符串/g’

下面举例子:

步骤一:查看原信息,查询IP

[root@localhost opt]# ifconfig eth0

eth0      Link encap:Ethernet  HWaddr 00:0C:29:82:6E:49  

          inet addr:192.168.211.128  Bcast:192.168.211.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe82:6e49/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:8217 errors:0 dropped:0 overruns:0 frame:0

          TX packets:5502 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000 

          RX bytes:810496 (791.5 KiB)  TX bytes:863585 (843.3 KiB)

步骤二:利用关键字配合grep选取出关键的一行数据。

[root@localhost opt]# ifconfig eth0|grep 'inet addr'

          inet addr:192.168.211.128  Bcast:192.168.211.255  Mask:255.255.255.0

步骤三:将IP前面的部分予以删除

[root@localhost opt]# ifconfig eth0|grep 'inet addr'|sed 's/^.*addr://g'

192.168.211.128  Bcast:192.168.211.255  Mask:255.255.255.0

步骤四:将IP后面的部分予以删除

[root@localhost opt]# ifconfig eth0| grep 'inet addr'| sed 's/^.*addr://g'|sed 's/Bcast.*$//g'

192.168.211.128

再举一个例子

步骤一:先使用grep将关键字MAN所在行取出来


[root@localhost opt]# cat /etc/man.config | grep 'MAN'

# when MANPATH contains an empty substring), to find out where the cat

# MANBIN pathname

# MANPATH manpath_element [corresponding_catdir]

# MANPATH_MAP path_element manpath_element

# MANBIN /usr/local/bin/man

# Every automatically generated MANPATH includes these fields

MANPATH /usr/man

MANPATH /usr/share/man

MANPATH /usr/local/man

MANPATH /usr/local/share/man

MANPATH /usr/X11R6/man

# MANPATH /opt/*/man

# MANPATH /usr/lib/*/man

# MANPATH /usr/share/*/man

# MANPATH /usr/kerberos/man

# Set up PATH to MANPATH mapping

MANPATH_MAP /bin /usr/share/man

MANPATH_MAP /sbin /usr/share/man

MANPATH_MAP /usr/bin /usr/share/man

MANPATH_MAP /usr/sbin /usr/share/man

MANPATH_MAP /usr/local/bin /usr/local/share/man

MANPATH_MAP /usr/local/sbin /usr/local/share/man

MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man

MANPATH_MAP /usr/bin/X11 /usr/X11R6/man

MANPATH_MAP /usr/bin/mh /usr/share/man

# and the MANSECT environment variable is not set (1x-8x sections are used by

MANSECT 1:1p:8:2:3:3p:4:5:6:7:9:0p:n:l:p:o:1x:2x:3x:4x:5x:6x:7x:8x

#MANDEFOPTIONS -a

步骤二:删除掉批注之后的数据!

[root@localhost opt]# cat /etc/man.config | grep 'MAN'|sed 's/#.*//g'







MANPATH /usr/man

MANPATH /usr/share/man

MANPATH /usr/local/man

MANPATH /usr/local/share/man

MANPATH /usr/X11R6/man






MANPATH_MAP /bin /usr/share/man

MANPATH_MAP /sbin /usr/share/man

MANPATH_MAP /usr/bin /usr/share/man

MANPATH_MAP /usr/sbin /usr/share/man

MANPATH_MAP /usr/local/bin /usr/local/share/man

MANPATH_MAP /usr/local/sbin /usr/local/share/man

MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man

MANPATH_MAP /usr/bin/X11 /usr/X11R6/man

MANPATH_MAP /usr/bin/mh /usr/share/man


MANSECT 1:1p:8:2:3:3p:4:5:6:7:9:0p:n:l:p:o:1x:2x:3x:4x:5x:6x:7x:8x

步骤三:将空白行删除掉

[root@localhost opt]# cat /etc/man.config | grep 'MAN'|sed 's/#.*//g'|sed '/^$/d'

MANPATH /usr/man

MANPATH /usr/share/man

MANPATH /usr/local/man

MANPATH /usr/local/share/man

MANPATH /usr/X11R6/man

MANPATH_MAP /bin /usr/share/man

MANPATH_MAP /sbin /usr/share/man

MANPATH_MAP /usr/bin /usr/share/man

MANPATH_MAP /usr/sbin /usr/share/man

MANPATH_MAP /usr/local/bin /usr/local/share/man

MANPATH_MAP /usr/local/sbin /usr/local/share/man

MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man

MANPATH_MAP /usr/bin/X11 /usr/X11R6/man

MANPATH_MAP /usr/bin/mh /usr/share/man

MANSECT 1:1p:8:2:3:3p:4:5:6:7:9:0p:n:l:p:o:1x:2x:3x:4x:5x:6x:7x:8x

直接修改文件内容

sed也可以直接修改文件内容。

[root@localhost opt]# sed -i '$a #This is a test' passwd

[root@localhost opt]# nl passwd | sed -n '$p'

    37 #This is a test

这个sed不错。大家可以学习一下。



本文转自aaa超超aaa 51CTO博客,原文链接:http://blog.51cto.com/10983441/1763356

相关文章
|
1月前
|
人工智能 搜索推荐 Unix
vim的使用介绍以及命令大全(系统性学习day3)
vim的使用介绍以及命令大全(系统性学习day3)
|
Oracle 关系型数据库 MySQL
linux常用命令 满足99%的开发需要
本篇内容记录了关于linux常用命令的一些基本知识。
126 0
|
数据可视化 NoSQL Unix
Linux系统开发: 基础命令学习
Linux系统开发: 基础命令学习
156 0
Linux系统开发: 基础命令学习
|
安全 Shell Linux
oeasy 教您玩转linux 之 010209 装酷利器 hollywood
oeasy 教您玩转linux 之 010209 装酷利器 hollywood
286 0
|
机器学习/深度学习 Shell Linux
《Linux命令行与shell脚本编程大全》第二十一章 sed进阶
本章介绍一些sed编辑器提供的高级特性。   21.1 多行命令 按照之前的知识,所有的sed编辑器命令都是针对单行数据执行操作的。 在sed编辑器读取数据流时,它会基于换行符的位置将数据分成行,一次处理一行数据。
1110 0
|
存储 Shell Linux
《Linux命令行与shell脚本编程大全》第二十二章 gawk进阶
gawk是一门功能丰富的编程语言,你可以通过它所提供的各种特性来编写好几程序处理数据。  22.1 使用变量 gawk编程语言支持两种不同类型的变量: 内建变量和自定义变量   22.1.1 内建变量 gawk程序使用内建变量来引用程序数据里的一些特殊功能   1.字段和记录分隔符变量 数据字段变量:允许你使用美元符和字段在该记录中的位置值来引用记录对应的字段。
998 0
|
Shell Linux Perl
《Linux命令行与shell脚本编程大全》第十九章 初识sed和gawk
这两个工具能够极大简化需要进行的数据处理任务。 19.1 文本处理 能轻松实现自动格式化、插入、修改或删除文本元素的简单命令行编辑。 sed和gawk就具备上述功能 19.1.1 sed编辑器 被称为流编辑器。
1078 0
|
Shell Perl 开发工具