Linux三剑客之sed

 Sed简介  

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

 定址  

    可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行 ,美元符号($)表示最后一行 ,1~2表示奇数行,1~2表示偶数行。范围可以通过数据,正则表达式或者二者结合的方式确定 。  


sed命令

利用script处理文本文件

语法

sed [OPTION]… {script-only-if-no-other-script} [input-file]…

常用选项

-n:不输出模式空间内容的自动打印

-e: 多点编辑

-f /PATH/TO/SCRIPT_FILE: 从指定文件中读取编辑脚本

-r: 支持使用扩展正则表达式

-i: 原处编辑(慎用)

script

调用sed命令有两种形式:  

a\  在当前行后面加入一行文本。

d   从模板块(Pattern space)位置删除行。

i\  在当前行上面插入文本。

c\  用新的文本改变本行的文本。 

p   打印模板块的行。

r   file 从file中读行

w   file 写并追加模板块到file末尾。

!   表示后面的命令对所有没有被选定的行发生作用。(取反)

=   打印当前行号码。

s/re/string 用string替换正则表达式re。

g   表示行内全面替换。

p   表示打印行。

w   表示把行写入一个文件。

&   保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。


示例

sed '2d' test #删除test文件的第二行

sed '2,$d'test #删除文件的第二行到末尾所有行

sed '$d' file #删除文件file的最后一行

sed '/text/d' text #删除带有text的行

sed -n 's/system/config/gp' test #把system替换为config,只显示被匹配到的行,g使行内多个符合匹配都能匹配(默认匹配没行的第一个)

sed -n 's/\(love\)ly/\1er/pg' test  #把所有的lovely替换为loveer,且打印出来 

sed -n 's@192.168.1.1@myipis&@p' test #把192.168.1.1都会替换成为myipis192.168.1.1。紧随s的符号都被认为是分隔符,所以@在这里就是分隔符

sed -e '1,2d' -e 's#haha#laugh#' test #允许在同一行里执行多条命令。如例子里第一条命令删除1至2行,第二条命令用laugh替换haha。

1、删除/etc/grub.conf文件中所有以空白开头的行行首的空白字符

 sed 's#^[[:space:]]\+##' /etc/grub.conf

2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符

 sed  's@^#[[:space:]]\+@@' /etc/fstab

3、在/root/install.log每一行行首增加#号

  sed 's@^@&#@' /root/install.log

4、在/etc/fstab文件中不以#开头的行的行首增加#号

  sed 's@[^#]@#@' /etc/fstab

5、处理/etc/fstab路径,使用sed命令取出其目录名和基名

  echo '/etc/fstab' | sed -r 's#(.*/)([^/]+/?)#\1#'

  echo '/etc/fstab' | sed -r 's#(.*/)([^/]+/?)#\2#'

6、利用sed 取出ifconfig命令中本机的IPv4地址

  ifconfig|sed  -n '/inet addr/p' |tr  -s ':' ' '|cut -d' ' -f4

7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数

  ls /media/Package |sed -r 's@.*\.(.*)\.rpm$@\1@'|sort|uniq -c


sed命令的高级用法

高级编辑命令:

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

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

g: 从保持空间取出数据覆盖至模式空间

G:从保持空间取出内容追加至模式空间

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

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

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

d: 删除模式空间中的行

D:删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

示例

[root@localhost /]# cat passwd #测试文件
     1wang:x:507:507::/home/wang:/bin/bash
     2mage:x:508:508::/home/mage:/bin/bash
     3uuuu:x:509:509:/bin/bash:/home/uuuu:/bin/bash
     4fedora:x:510:510::/home/fedora:/bin/bash
     5user1:x:511:511::/home/user1:/bin/bash
     61100:x:1100:1100::/home/1100:/bin/bash
     7499:x:495:1101::/home/499:/bin/bash
     81999:x:1999:1999::/home/1999:/bin/bash
     91820:x:1500:1500::/home/1820:/bin/bash
    10GLLL:x:2000:2000::/home/GLLL:/bin/bash
[root@localhost /]# sed -n 'n;p' passwd #仅显示偶数行
     2mage:x:508:508::/home/mage:/bin/bash
     4fedora:x:510:510::/home/fedora:/bin/bash
     61100:x:1100:1100::/home/1100:/bin/bash
     81999:x:1999:1999::/home/1999:/bin/bash
     10GLLL:x:2000:2000::/home/GLLL:/bin/bash
[root@localhost /]# sed '1!G;h;$!d' passwd #倒序显示
     10GLLL:x:2000:2000::/home/GLLL:/bin/bash
     91820:x:1500:1500::/home/1820:/bin/bash
     81999:x:1999:1999::/home/1999:/bin/bash
     7499:x:495:1101::/home/499:/bin/bash
     61100:x:1100:1100::/home/1100:/bin/bash
     5user1:x:511:511::/home/user1:/bin/bash
     4fedora:x:510:510::/home/fedora:/bin/bash
     3uuuu:x:509:509:/bin/bash:/home/uuuu:/bin/bash
     2mage:x:508:508::/home/mage:/bin/bash
     1wang:x:507:507::/home/wang:/bin/bash
[root@localhost /]# sed '$!N;$!D' passwd #仅显示最后两行
     91820:x:1500:1500::/home/1820:/bin/bash
    10GLLL:x:2000:2000::/home/GLLL:/bin/bash
[root@localhost /]# sed '$!d' passwd #显示最后一行
    10GLLL:x:2000:2000::/home/GLLL:/bin/bash

原创文章,作者:ladsdm,如若转载,请注明出处:http://www.178linux.com/33960

(0)
ladsdmladsdm
上一篇 2016-08-12 14:45
下一篇 2016-08-12 16:06

相关推荐

  • 新的旅途

    三月末的北京已经让人感觉有些炎热,这是我第一次来北京。对我而言这是我人生的另一个起点,押上了我所有骄傲承载着我的梦想对未来所有的期望。这是一场豪赌,新的旅途,从今天开始。

    2018-03-26
  • 详解linux磁盘管理

                           磁盘管理 设备文件 1. I/O ports:I/O设备地址 2. 一切皆文件,open(),read(),write(),close(),对设备的操作也都是通     过这…

    Linux干货 2016-08-29
  • lvs——高可用集群

    技术简介: LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性 集群采用…

    Linux干货 2016-10-26
  • 网络基础知识子网划分

    一、某公司申请到一个C 类IP 地址,但要连接6 个的子公司,最大的一个子 公司有26 台计算机,每个子公司在一个网段中,则子网掩码应设为?  根据要划分的子网数量来算子网掩码的。2的M次方大于等于N。其中M是划分子网时要借的位数。N是要划分的子网数。 将需求代入公式,M=3,C类IP默认的掩码为24位,再从主机位中借来3位,就是27位。二进制表示…

    Linux干货 2016-09-06
  • 不忘初心,砥砺前行!

    这是本人第一次书写博客,难免有些小心翼翼,手足无措,但每个人都有这样的经历,转念一想也就释怀了。时光飞速,我们已不再年轻,从大学毕业的那天起,我们就再也不是小孩子了。 7月的天气总是那么折磨人,高温让我们步履维艰,在7月只想找一片月淡风轻的乐土,度过一个难熬的夏天,或找一间空调房,调大音量,享受午后时光。但这样的日却离我们很远,这个夏天我们背起行囊,远离故土…

    2017-07-11
  • Linux用户和组管理及相关命令详解

        概要:在学习Linux的初级阶段,用户管理是基础管理的重要部分,任何命令的运行,系统的正常运转,均离不开用户管理的内容,本篇就为大家介绍下Linux用户管理的一些基础概念和一些基础命令的用法。内容主要分为以下三个部分:        &nbs…

    Linux干货 2016-08-02