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

sed工具

[[email protected] ~]#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行删除。

[[email protected] 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

[[email protected] 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

[[email protected] 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?”字样!

[[email protected] 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?’

[[email protected] 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?”

[[email protected] 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”

[[email protected] 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行

[[email protected] 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的以行为单位的显示功能,就能将某个文件内的某些行号查出来。

[[email protected] 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

[[email protected] 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选取出关键的一行数据。

[[email protected] opt]# ifconfig eth0|grep ‘inet addr‘

inet addr:192.168.211.128  Bcast:192.168.211.255  Mask:255.255.255.0

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

[[email protected] 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后面的部分予以删除

[[email protected] opt]# ifconfig eth0| grep ‘inet addr‘| sed ‘s/^.*addr://g‘|sed ‘s/Bcast.*$//g‘

192.168.211.128

再举一个例子

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

[[email protected] 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

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

[[email protected] 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

步骤三:将空白行删除掉

[[email protected] 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也可以直接修改文件内容。

[[email protected] opt]# sed -i ‘$a #This is a test‘ passwd

[[email protected] opt]# nl passwd | sed -n ‘$p‘

37 #This is a test

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

时间: 2024-08-08 00:27:32

根据鸟哥书籍学习 sed 工具的使用的相关文章

《鸟哥—基础学习》总结(8):Linux磁盘与文件系统管理 之 认识EXT2系统

1 磁盘组成与分区 1.1 磁盘物理组成 (1)圆形盘片-记录数据 (2)机械手臂及磁头-读写盘片数据 (3)主轴马达-使得机械手臂成功读写数据驱动 1.2 盘片物理组成 (1)扇区-最小物理存储单位,512bytes (2)柱面-扇区组成的圆,分区的最小单位 (3)第一扇区-最重要的扇区,包含主引导记录MBR446bytes 以及 分区表PB 64bytes 1.3 磁盘接口在Linux中文件名 (1)/dev/sd[a-p][1-15]  为 SCSI . SATA . USB . Flas

鸟哥书籍awk工具学习

awk工具 awk也是一个很好的数据处理工具.相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分成数个字段来处理.因此,awk相当适合处理小型的数据.awk通常的运行模式是这样的: [[email protected] opt]#awk '条件类型1{动作1}条件类型2{动作2}' filename awk后面接两个单引号并加上大括号{}来设置想要对数据进行的处理动作.qwk可以处理后续接的文件,也可以读取来自前个命令的standardoutput.但如前面说的,awk主要是处理每一

鸟哥书籍 FTP 学习

FTP服务器 一.FTP服务器简介 FTP服务器的功能除了单纯地进行文件的传输与管理之外,依据服务器软件的配置架构,它还可以提供以下几个主要的功能: 1.不同等级的用户身份:user.guest.anonynous FTP服务器在默认的情况下,依据用户登录的情况,分为三种不同的身份,分别是实体用户real user,访客guest,匿名用户anonymous.这三种身份的用户在系统上面的权限差异很大,例如实体用户取得的系统权限比较完整,所以可以进行比较多的操作:至于匿名用户,大概我们就仅提供他下

拜师鸟哥之linux学习体会(1)——计算器概论

之前一段时间看了鸟哥的linux私房菜,觉得写得很好,是一本很好的初识linux系统的书籍.接下来的每一天我都会对这本书的每一章的重点知识进行叙述,也算是对学习这本书的一个体会吧.今天讲一下概述部分,鉴于linux是一个操作系统,所以有必要先介绍下计算机方面的知识. 1.    计算机主要由以下几部分组成:输入单元.输出单元.CPU内部的控制单元.算术逻辑单元和主存储器.可以通过下图来描述. 主要介绍下CPU部分,CPU有两种类别:精简指令集RISC和复杂指令集CISC. 2.    本章的一个

《鸟哥的Linux私房菜》学习笔记(0)

听说Linux已经有很长一段时间了,但是从未系统的学习过Linux.这次把在博客园的处女秀给了Linux,希望能够给自己学习Linux一种坚持的动力,坚持就是胜利,fighting! 在我看来,成为技术大牛之前,写博客主要是对自己所学的东西作以总结,涉及的东西也稍显浅薄,但是却能够为更深一步的学习打下基础,于是我选择了写博客!以前从未写过博客,博客给人第一印象——高大上,现在要写了,顿感压力山大,还好本人的初衷是为了知识的整理,暂时这样安慰一下我自己吧.初期的博客,我想肯定会是非常糟糕的,但是我

跟鸟哥学Linux之——学习总结

整个下来看<鸟哥的Linux私房菜--基础篇>学习了很多的知识,从基本的Linux初步认识,到一些文件目录的认识和操作,一些基本命令的使用,最后初步认识了Linux中进程的操作和控制方法.现阶段对Linux基础的认识和学习就这些,下边是学习下来的博客总结: 1.跟鸟哥学Linux之--Linux规划!! 2.跟鸟哥学Linux之--从磁盘分区到文件系统 3.跟鸟哥学Linux之--浅谈文件权限 4.跟鸟哥学Linux之--对文件与目录操作命令汇总 5.跟鸟哥学Linux之--bash shel

鸟哥的Linux私房菜_基础版_学习笔记7:第十一章 认识与学习 BASH

11.1 认识 BASH 这个 Shell 图 1.1.1.硬件.核心与用户的相关性图示 11.1.4 Bash shell 的功能 既然 /bin/bash 是 Linux 默认的 shell ,bash 是 GNU 计划中重要的工具软件之一,目前也是 Linux distributions 的标准 shell . bash 主要兼容于 sh ,并且依据一些使用者需求,而加强的 shell 版本.不论你使用的是那个 distribution ,你都难逃需要学习 bash 的宿命啦!那么这个 s

【Linux】鸟哥的Linux私房菜基础学习篇整理(六)

1. 正则表达式特殊符号.[:alnum:]:代表英文大小写字符及数字:[:alpha:]:代表英文大小写字符:[:blank:]:代表空格键与[Tab]键:[:cntrl:]:代表键盘上的控制键,即包括CR.LF.Tab.Del键:[:digit:]:代表数字:[:graph:]:除了空格符外的其他所有按键:[:lower:]:代表英文小写字符:[:print:]:代表任何可以被打印出来的字符:[:punct:]:代表标点符号,即"'?!;:#$:[:upper:]:代表英文大写字符:[:sp

【Linux】鸟哥的Linux私房菜基础学习篇整理(一)

最近,一直在写PPC的模拟器和汇编器,也在做设计.所以重新看了看<鸟哥的Linux私房菜>,还是有好多命令不太熟悉.就打算写几篇blog记下来. 1. nl [-bnw] filename:添加行号打印参数:-b:指定行号指定的方式,主要有两种: -b a:表示不论是否为空行,也同样列出行号(类似cat -n): -b t:如果有空行,空的那一行不要列出行号(默认值).-n:列出行号表示的方法,主要有三种: -n ln:行号在屏幕的最左方显示: -n rn:行号在自己字段的最右方显示,且不加0