正则三剑客-sed

与grep不同的是,当使用sed匹配字符串的时候如下:

#sed -n ‘//‘p file             // 内填写需要匹配的字符串 例如: #sed -n ‘/root/’p /etc/passwd :匹配包含字符串root的行!(使用grep 匹配则是#grep ‘root’ /etc/passwd

[[email protected] sed]# grep 'root' passwd

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

operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] sed]# sed -n '/root/'p passwd

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

operator:x:11:0:operator:/root:/sbin/nologin

和grep一样也可使用特殊字符匹配:

# sed -n ‘/r.t/’p passwd

# sed -n ‘/r*t/’p passwd

# sed -nr ‘/o+t/’p passwd = #sed -n ‘/o\+t/’ passwd            -r:脱意的意思,类似于\

# sed -nr ‘/o{2}/’p passwd          //匹配两次o

# sed -nr ‘/root|login/’p passwd             //匹配root或login的行

总之一句话,想少用\  那你就用-r


sed打印指定的行(注意:sed -n 一般都是和p一起用):

#sed -n ‘2’p passwd          //打印第二行

#sed -n ‘2,5’p passwd                 //打印第二行到第五行

#sed -n ‘5,$‘p passwd                 //打印第五行到最后一行

#sed -n ‘1,$’p passwd                 //打印全部的行

#sed -e ‘2,5’p -e ‘/root/’p -n passwd               //打印第二行到第五行以及包含root的行 -e :多点编辑 //在一个表达式中执行多个动作!

# sed -n ‘/nologin/’Ip passwd    I:大写的i 代表着不区分大小写


sed删除指定的行:

案例分析:

假如有个日志文件,很大将近50G,如果使用vim打开进行删除,这样不仅浪费我们的硬件资源,而且还需要等待很长的时间,怎么能不打开就直接删除老的内容呢?

首先使用grep查找指定日期的行(#grep -n ‘关键字’ logfile)。

然后删除之后的所有行:

#sed -i ‘5000,$’d logfile i:修改内容   d:删除动作 //删除5000行到末尾的行

#sed -i ‘/user2/’d logfile          //删除user2这个关键字的行


sed替换功能:

#sed ‘1,20s/root/toor/g’ passwd

#sed -r ‘1,10s/ro+/r/g’ passwd                       //因为表达式中有 + 所以必须要使用 -r 去脱意

把如下字符串,以:为分割点进行第一个和最后一个调换位置:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[[email protected] sed]# head passwd | sed -r 's#([^:]+):(.*):([^:]+)#\3:\2:\1#g'

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

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

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

#sed ‘s#sbin/nologin#123#g’ passwd = #sed -r ‘s/\/sbin\/login/123/g’ passwd           //脱意一下

#sed ‘s/[a-zA-Z]//g’ passwd            //删除passwd中所有的英文字符(替换成空即为删除)

#head passwd | sed -r ‘s/(.*)/aaa:&/g’              //在前十行每行的前面添加 aaa:

##反复练习,方可熟能生巧##

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏架构师小秘圈

shell极简教程(二)

一,题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工作效率。没有一个大公司不要求linux的基本技能的,只是...

3887
来自专栏Golang语言社区

转--Golang语言-- Web 编程

1.golang的安装工具 1.1 GVM 第三方开发的Go多版本管理工具 2.golang环境变量 2.1 GOROOT=D:\go (golang 安装目录...

3586
来自专栏Golang语言社区

转-Go语言开发常见陷阱,你遇到过几个?

Go作为一种简便灵巧的语言,深受开发者的喜爱。但对于初学者来说,要想轻松驾驭它,还得做好细节学习工作。 初学者应该注意的地方: 大括号不能独立成行。 未使用变量...

3539
来自专栏Golang语言社区

转--Golang语言-- Web 编程

1.golang的安装工具 1.1 GVM 第三方开发的Go多版本管理工具 2.golang环境变量 2.1 GOROOT=D:\go (golang 安装目录...

3718
来自专栏杨龙飞前端

js中的this关键字,setTimeout(),setInterval()的执行过程

1305
来自专栏机器学习从入门到成神

Spring在 IOC 容器中 Bean 之间的关系

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

961
来自专栏jmeter高手高高手

Jmeter(五)_函数

1、它有两个参数,第一个参数是要执行的语句,可以是beanshell语句或者是文件地址,是必选参数;第二个参数是保存结果的变量名称,非必选参数。

1632
来自专栏狮乐园

高级 Angular 组件模式 (5)

在之前的例子中,已经出现多次使用template reference variable(模板引用变量)的场景,现在让我们来深入研究如何通过使用模板引用变量来关联...

892
来自专栏大内老A

ASP.NET Web API中的Controller

虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是A...

19210
来自专栏柠檬先生

Sass 基础(四)

当你想设置属性值的时候你可以使用字符串插入进来,另一个使用的用法是构建一个选择器。       @mixin generate-sizes($class,$s...

2357

扫码关注云+社区