Linux三剑客之一sed用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux三剑客之一sed用法相关的知识,希望对你有一定的参考价值。

sed是一种流编辑器,主要针对文本行进行处理,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

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

工作原理:在内存中申请两个个空间,分别叫做模式空间和保持空间,基本用法采用模式空间进行对每一个行进行处理,利用用户定义的pattern对读取到模式空间的每一进行处理并将处理结果默认打印到屏幕。高级用法使用模式空间和保持空间共同处理完成高级作业。

Sed的基本语法为sed [option]scripts file,具体选项、地址定界、编辑命令和处理目标文件等,另外sed取字段或其他内容时,通常采用分组替换思路解决问题,具体如下所示:

命令

选项

Scripts

File

Sed

[nefri]

地址定界

编辑命令

目标文件

选项介绍:

-n:关闭命令本身默认输出的内容,仅输出经过利用用户自定义的pattern进行对pattern空间处理每一个行文本后的动作,即地址定界+编辑命令的结果。

-e:多点编辑,同时可以多每一行进行多次编辑

-f:从指定文件中读取编辑脚本

-r:启用扩展正则表达式

-i.bak:备份文件并原处编辑

实例演示:-n关闭默认输出的信息

[[email protected]  ~]#ifconfig ens33|sed ‘/netmask/p‘  #验证默认输出+模式匹配动作

ens33:  flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.100.129  netmask 255.255.255.0  broadcast 192.168.100.255

        inet 192.168.100.129  netmask 255.255.255.0  broadcast 192.168.100.255

        inet6 fe80::20c:29ff:fecf:ed55  prefixlen 64  scopeid 0x20<link>

        ether 00:0c:29:cf:ed:55  txqueuelen 1000  (Ethernet)

        RX packets 16075  bytes 1508980 (1.4 MiB)

        RX errors 0  dropped 0   overruns 0  frame 0

        TX packets 12329  bytes 2347525 (2.2 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0   collisions 0

[[email protected]  ~]#ifconfig ens33|sed -n ‘/netmask/p‘ #验证关闭默认输出

        inet 192.168.100.129  netmask 255.255.255.0  broadcast 192.168.100.255

[[email protected]  ~]#sed -i ‘/SELINUX=/c\SELINUX=disabled‘ /etc/selinux/config

[[email protected]  ~]#cat /etc/selinux/config  #利用sed关闭selinux

#  This file controls the state of SELinux on the system.

SELINUX=disabled

#     enforcing - SELinux security policy is  enforced.

#     permissive - SELinux prints warnings  instead of enforcing.

#     disabled - No SELinux policy is loaded.

SELINUX=disabled

#  SELINUXTYPE= can take one of three two values:

#     targeted - Targeted processes are  protected,

#     minimum - Modification of targeted  policy. Only selected processes are protected.

#     mls - Multi Level Security protection.

SELINUXTYPE=targeted

[[email protected]  ~]#sed -n -e ‘/^root\>/p‘ -e ‘s/root/rooter/gp‘ p

root:x:0:0:root:/root:/bin/bash                #第一个e是全文匹配出来以root开

rooter:x:0:0:rooter:/rooter:/bin/bash           行打印出来头的  

operator:x:11:0:operator:/rooter:/sbin/nologin  #第二个e是全文再次搜索替换

#在有两个e时,每一个e都是对全文进行操作

ifconfig  ens33|sed -n -e ‘2s/^.*inet //‘ -e ‘2s/ .*$//p‘

192.168.100.129                       #此时同时对第2行进行模式处理并打印

命令ifconfig ens33本身默认有信息在屏幕上输出,另外文本的每一行逐一被调度到模式空间中被定义的‘/netmask/p‘处理,pattern匹配到有netmask的行打印,故实例中匹配到netmask行显示两行,其中1行是默认输出的信息,另外一行是经过pattern处理后打印出的信息。如若关闭默认输出时,则只显示pattern处理的信息。

   地址定界:

地址定界

含义

不给地址

对全文进行处理

单地址

#

指定的行

/pattern/

被此处模式所能匹配到的每一行

地址范围

#,#

从多少行到多少行

#,+#

从多少行到加多少行

/part/,/part/

从模式所匹配到的行再到模式匹配到的行(文本中的每一行都要进入模式空间进行处理)

#,/part/

从多少行到模式所能匹配到的行

~进步

1~2

从第一行+2行,依次类推一直向上叠加,即显示奇数行

2~2

从第二行+2行,依次类推一直向上叠加,即显示偶数行

编辑命令:

D

删除模式空间匹配到的行,并立即进入下一轮的循环

P

打印当前模式空间内容,追加到默认输出之后

a[\]text

指定行后面追加文本,支持使用\n实现多行追加

i[\]text

指定行前面追加文本,支持使用\n实现多行追加

c[\]text

替换模式匹配到的行

w/path/somefile

保存模式匹配到的行到某文件

r/path/somefile

读取文件指定的行到模式空间进行处理

=

打印模式匹配到行的行号

模式空间中匹配行取法处理

s///,[email protected]@@,s###

查找替换,如s/1234/abcd/,查找到1234替换为abcd,

替换标记g:全局替换 p;打印替换成功的行 w/path/TO/somefile 保存替换的行到文件中

实例演示:

[[email protected] ~]#sed -n  ‘/^root\>/s/^/#/p‘ /etc/passwd

#root:x:0:0:root:/root:/bin/bash #对正则表达式匹配出来后进行进行增加#注释

[[email protected] ~]#sed -rn ‘s/(^root)/\101/p‘  p

root01:x:0:0:root:/root:/bin/bash#利用扩展正则表达式对文本进行搜索替换

[[email protected] ~]#sed -i.bak ‘/^# Source/i\alias  vname="vim /etc/sysconfig/network"‘ .bashrc   #利用正则表达式在# Source开头的行前添加别名

[[email protected] ~]#cat .bashrc     #验证说明可以实现此项功能

# .bashrc

# User specific aliases and functions

alias rm=`echo rm can not use`

alias cp=‘cp -i‘

alias vname="vim /etc/sysconfig/network"

# Source global definitions

if [ -f /etc/bashrc ]; then

  .  /etc/bashrc

fi

[[email protected] ~]#sed -i.bak ‘2i\This is my  alias name‘ .bashrc

[[email protected] ~]#cat .bashrc     #在第2行前增加注释

# .bashrc

This is my alias name

# User specific aliases and functions

alias vname="vim  /etc/sysconfig/network"

descript good

# Source global definitions

alias vname="vim  /etc/sysconfig/network"

if [ -f /etc/bashrc ]; then

  .  /etc/bashrc

Fi

[[email protected] ~]#ifconfig ens33|sed -e  ‘2!d;s/.*inet //;s/ .*$//‘

192.168.100.129           #封号表示顺序执行,除第2行的删除继续pattern处理

取父目录名或取基名,选组1则是父目录名,选组2则是基名

[[email protected]  /media/Packages]#ls |sed -r -n ‘s/^.*[.]([^.]+).rpm/\1/p‘|sort|uniq –c                                                  #取镜像中.rpm包的分类个数

   2000 i686

   2938 noarch

    4069x86_64

[[email protected] /media/Packages]#cat/etc/init.d/functions | sed -r ‘s/[^[:alpha:]]+/\n/g‘|sort|uniq –c  #取文件中的单词个数,思路是:非单词换行最后统计


本文出自 “11831715” 博客,谢绝转载!

以上是关于Linux三剑客之一sed用法的主要内容,如果未能解决你的问题,请参考以下文章

Linux文本处理三剑客grepsedawk用法详解

Linux三剑客之sed的基本用法介绍

1.10-linux三剑客之sed命令详解及用法

1.10-linux三剑客之sed命令详解及用法

Linux文本处理三剑客之---sed

3. linux常用命令及三剑客 grep sed awk 用法