sed对比grep之理解

sed对比grep之理解

很多时候回车按下,没有结果,或是报错。 检查发现都是低级错误,关键是习惯刚学完grep,有写习惯没改过来。 sed语法很重要。script语法写对了,就成功了一大半,剩下的就是正则表达式的问题了。

sed与grep的区别是

grep是个行过滤器,筛选符合条件的行。也可以只显示每行匹配到的文本(-o选项),不对文本进行编辑,只是显示查找结果。 可以高亮显示查找结果。

sed是针对行的编辑器。根据地址界定(可是使用行号,正则表达式)对指定的进行编辑,编辑操作有删除,增加新行可多行,插入新行可多行。替换行 为单行或多行。 针对行内的内容修改只能是查找替换针对文本行进行编辑,编辑后使用p命令输出至标准输出。不能够高亮显示查找编辑结果。sed -i 原处编辑,改变文件内容,否则只是显示出来原文件无变化。

语法:

地址界定时使用的正则表达式的两边必须是/ 如 /patter/

script中的动作命令例如d和p。需要同时都要执行时,命令之间要加分号 ;

编辑命令:

d: 删除模式空间匹配到的行
p: 显示模式空间匹配到的行
a \text:在行后面追加文本;支持使用\n实现多行追加
i\text:在行前面插入文本;支持使用\n实现多行插入
c \text:替换行为单行或多行文本
w /path/to/somefile: 保存模式匹配的行至指定文件
r /path/from/somefile:读取指定文件的文本至模式空
间中匹配到的行后
=: 为模式空间中的行打印行号
!:模式空间中匹配进行取反处理

s///:查找替换,支持使用其它分隔符,s@@@,s###  要替换的内容使用正则表达式不使用//
替换标记:
g: 行内全局替换  按行匹配,一行内多次匹配。
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

sed默认支持基本正则表达式,有时候写表达式的时候经常忘记加上“\”,建议用到正则表达式的话在sed的【options】中加上-r

script语法格式:

先地址界定COMMAND;COMMAND
必须指定要界定的地址,即想好要处理那些的行,再指定要做哪些动作(干什么)。命令之间必须分号隔开;

运行原理

sed是一个非交互式的流编辑器。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出;而所谓流编辑器,是指sed每次只从文件(或输入)读入一行,然后对该行进行指定的处理,并将结果输出到屏幕(除非取消了屏幕输出又没有显式地使用打印命令),接着读入下一行。整个文件像流水一样被逐行处理然后逐行输出。

每次读取一个新行,执行一次script,循环执行直到最后一行。

sed显示特性

一次处读取一行,送到模式空间后没有被script匹配到的行默认显示 
    参数 -n 没有匹配到的行 不显示。

匹配到的且处理过的行  ‘script’中加入命令p 显示匹配到且处理过的行

经过命令处理的行(包括p),默认不输出,命令p是打印
w命令  w /path/to/somefile: 保存模式匹配的行至指定文件

查找替换的结果是默认显示的。无需p命令

关于查找替换

是只是每行第一次被查找到的内容被替换,要想全文替换,或目标行替换,就得在script中加g命令。从行首匹配替换到行尾

练习

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

    [root@yangyouwei ~]# sed 's@^[[:space:]]*@@' f5  
    abc
    bsdf
    
    
    ffsd
    f
    t

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

    [root@yangyouwei ~]# sed -n 's@^#[[:space:]]\+@@p' /etc/fstab
    /etc/fstab
    Created by anaconda on Wed Jul 20 16:58:24 2016
    Accessible filesystems, by reference, are maintained under '/dev/disk'
    See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    [root@yangyouwei ~]#

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

    [root@yangyouwei ~]# sed -rn 's@(^.*$)@#\1@p' /etc/fstab
    [root@yangyouwei ~]# sed -n 's@^@#@p' /etc/fstab

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

    [root@yangyouwei ~]# sed -rn 's@^[^#]@#@p' /etc/fstab

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

    [root@yangyouwei ~]# echo /etc/fstab |sed -nr 's@[^/]+/?$@@p'
    /etc/

    [root@yangyouwei ~]# echo /etc/fstab |rev | sed -nr 's@/[^/]*/$@@p' |rev
    fstab

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

    [root@yangyouwei ~]# ifconfig | sed -nr '/Bcast/p' | sed -nr 's@[[:alpha:]:]*@@g;p' | sed -nr 's@^[[:space:]]+@@p' | sed -nr 's@[[:space:]]+.*$@@p'
    192.168.226.128

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

    [root@yangyouwei ~]# ls /media/cdrom/Packages/ | sed -nr 's@.[^.]*$@@p' | rev | cut -d. -f1 |sort | uniq -c
       2283 46_68x
          4 686i
        919 hcraon
          1 SNART

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

(0)
yywyyw
上一篇 2016-08-10
下一篇 2016-08-10

相关推荐

  • N25_第十二周作业

    1、请描述一次完整的http请求处理过程;     1)建立或者处理连接:建立请求或拒绝请求     2)接收请求:接收来自于网络上的主机请求报文中对特定资源的一次请求的过程;     3)处理请求:对请求报文进行解析,主要获取客户端请求的…

    Linux干货 2017-03-06
  • 计算机基础入门及Pyhton基础

    编程基础 计算机基础 程序(program识别并执行的指令 计算机是执行程序的机器 现代计算机 艾伦·麦席森·图灵奠定了现在计算机的逻辑工作方式的基础 冯·诺依曼提出计算机应该有五大部件组成:输入/输出设备、运算器、控制器、输出设备。这是现代计算机基本框架。 语言基础 计算机语言:与计算机之间交互的语言 机器语言:一定位数的二进制代码成为机器指令,指令集合则…

    2017-09-16
  • LNMP编译安装-week16

    1、源码编译安装LNMP架构环境; 系统: CentOS 7.2IP: 172.16.0.11版本: nginx-1.10.3 php-5.6.30 mysql-5.6.30 一.安装开发包组 ~]# yum -y groupinstall “Development Tools” “Server Platform Development” 二.编译安装ngi…

    2017-05-11
  • Linux磁盘管理

    一、磁盘简介 机械硬盘的组成部件主要有:盘片、机械手臂、磁头与主轴马达;盘片又可以细分为扇区(Sector)和磁道(Track),所有盘片的同一个磁道称之为柱面(Cylinder) 目前主流的磁盘接口有SCSI、SATA、SAS、USB等 Linux一切皆文件,硬件设备也有对应的文件,linux访问设备,其实就是访问与其对应的文件系统接口 设备文件: &nb…

    Linux干货 2016-06-01
  • keepalive配置文件详解

    第一部分:全局定义块 1、email通知。作用:有故障,发邮件报警。 2、Lvs负载均衡器标识(lvs_id)。在一个网络内,它应该是唯一的。 3、花括号“{}”。用来分隔定义块,因此必须成对出现。如果写漏了,keepalived运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。 global_defs{ n…

    2017-09-17
  • Memcache存储大数据的问题

    Memcache存储大数据的问题   huangguisu       Memcached存储单个item最大数据是在1MB内,如果数据超过1M,存取set和get是都是返回false,而且引起性能的问题。 我们之前对排行榜的数据进行缓存,由于排行榜在我们所有sql select…

    Linux干货 2015-05-05