前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux之sed命令详解

Linux之sed命令详解

作者头像
AsiaYe
发布2019-11-06 15:23:33
3.1K0
发布2019-11-06 15:23:33
举报
文章被收录于专栏:DBA随笔DBA随笔
Linux之sed命令 上次的文章中提到了Linux sed在脚本中的应用,他可以将一系列日表操作,根据日期的不同,逐一写进一个文件中,最终生成我们想要的结果,今天详细介绍一下Linux中的sed命令,今天的文章中将会看到大量的实例。
简介
Linux sed命令是利用script来处理文本文件。

sed可依照script的指令,来处理、编辑文本文件。

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

语法 sed [-hnV][-e<script>][-f<script文件>][文本文件]

参数说明:

  • -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
  • -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
  • -h或--help 显示帮助。
  • -n或--quiet或--silent 仅显示script处理后的结果。
  • -V或--version 显示版本信息
  • -i∶直接修改读取的档案内容,而不是由屏幕输出。

动作说明

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g

实例

1、在testfile.txt第一行后面添加一行newLine,并将结果输出到屏幕上:

代码语言:javascript
复制

sed -e 1a\newLine testfile

代码语言:javascript
复制

需要注意的是,这种-e的方法并没有在文件内部真正添加这一行数据,只是在终端的显示上面添加了。

如果需要增加多行,则需要在增加的内容上利用\n换行

2.以行为单位的新增,删除

将 testfile.txt中的内容列出并且列印行号,同时,请将第 2~4 行删除!

nl testfile.txt | sed '2,4d'或者sed '2,4d' testfile.txt

要删除第 3 到最后一行

nl testfile.txt | sed '3,$d'或者sed '3,$d' testfile.txt

这里的$符号,就是最后一行的意思

如果要在第二行前面添加一行,内容为'new line 2',命令如下:

nl testfile.txt | sed '2i new line 2'或者sed '2i new line 2' testfile.txt

3.以行为单位的替换和显示

如果我们想把第2-4行的数据替换为 line 2~4,可以使用下面的命令:

nl testfile.txt | sed '2,4c line 2~4'或者sed '2,4c line 2~4' testfile.txt

将文件从第3行到最后一行打印出来:

nl testfile.txt | sed -n '3,$p'或者sed '3,$p' testfile.txt

4.数据搜寻处理

搜索 testfile.txt中包含有关键字‘4’的行

nl testfile.txt | sed -n '/4/p'或者sed -n '/4/p' testfile.txt

数据的搜寻并执行命令,搜索testfile.txt,找到关键字‘4’对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把4替换为four,再输出这行:

数据的搜寻并替换

除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!有点像这样:

sed 's/要被取代的字串/新的字串/g'

举个例子,我们查看自己电脑的ip地址,如下:

如果我们相用一条命令把这个inet addr查出来,应该怎么做呢?

首先通过命令找到inet addr这一行,

将inet addr前面的部分删除:

ifconfig eth3|grep 'inet addr'|sed 's/^.*addr://g'

注意,其中的^.*addr:代表的是从开始到addr:前面的字符。后面的双斜线里面什么都没写,说明是替换为空串,也就是删除的意思。

代码语言:javascript
复制

再讲inet addr后面的部分删除:

ifconfig eth3|grep 'inet addr'|sed 's/^.*addr://g'|sed 's/Bcast.*$//g'

Bcast.*$指的是从Bcast到最后面的字符。后面的双斜线里面什么都没写,说明是替换为空串,也就是删除的意思。

这样,我们就直接得到了一个IP地址。

5.危险动作:直接修改文件内容

上面所述的四种方法,都是不直接修改文件内容的,他们仅仅修改文件在控制台输出的结果,当我们想要直接修改文件内容的时候,需要添加-i参数,这里我们进行一些实验,首先我们编辑一个测试文件testfile2.txt,内容如下:

我们可以看到,每一行都是一个单词加一个符号,前四行是以.结尾,后面两行是以-结尾,我们首先进行如下操作,将以.结尾的行,换成!结尾,命令如下:

sed -i 's/\.$/\!/g' testfile2.txt

我们对这个命令进行解释:替换命令内部结构依旧是s/旧字符串/新字符串/g的模式,这里的旧字符是' \.$ ',而新字符串是' \! ' ,这里使用反斜线\屏蔽特殊含义

6.其他的一些应用

删除匹配行

sed -i '/匹配字符串/d' filename

(注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)

替换匹配行中的某个字符串

sed -i '/匹配字符串/s/旧字符串/新字符串/g' filename

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据的搜寻并执行命令,搜索testfile.txt,找到关键字‘4’对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把4替换为four,再输出这行:
  • 数据的搜寻并替换
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档