Linux三剑客命令之sed

Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep

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

整理不易,如需转发请注明出处

终端输入sed --help可以看到所有的语法参数,翻译了部分,举例一些常用的实例 

一、参数说明

-e :直接在命令行模式上进行sed动作编辑,此为默认选项;

-e允许在同一行里执行多条命令,删除1行,第二条命令用start替换shutdown

[root@master ~]#  sed -e '1d' -e 's//start/' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
start:x:6:0:shutdown:/sbin:/sbin/shutdown

-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
-i :直接修改文件内容;

直接删除passwd的root行,-i参数是直接可以修改文件那日容的

[root@master ~]# sed -i '1d' passwd
[root@master ~]# cat passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

-n :只打印模式匹配的行;

打印第一行内容

[root@master ~]# sed -n 1p passwd 
root:x:0:0:root:/root:/bin/bash

-r :支持扩展表达式;
-h或--help:显示帮助;
-V或--version:显示版本信息。

二、sed常用参数:

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~

在第一行下面插入yunwei

[root@master ~]# sed '1a yunwei' passwd 
root:x:0:0:root:/root:/bin/bash
yunwei
bin:x:1:1:bin:/bin:/sbin/nologin

c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!

替换第二行内容

[root@master ~]# sed '2c yunwei' passwd 
root:x:0:0:root:/root:/bin/bash
yunwei

d :删除,因为是删除,所以 d 后面通常不接任何文本;

删除第一行root

[root@master ~]# sed 1d passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin


i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

在第一行和第二行中间插入yunwei

[root@master ~]# sed '2i yunwei' passwd 
root:x:0:0:root:/root:/bin/bash
yunwei
bin:x:1:1:bin:/bin:/sbin/nologin

p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~

打印第一行和第二行的内容

[root@master ~]# sed -n '1,2p' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

s :取代,可以直接进行取代,通常这个 s 的动作可以搭配正规表示法

把文中的root替换成toor,s/root/toor/g后面添加上g就是全部都替换

[root@master ~]# sed 's/root/toor/' passwd 
toor:x:0:0:root:/root:/bin/bash

h :拷贝模板块的内容到内存中的缓冲区;
H :追加模板块的内容到内存中的缓冲区;
g :获得内存缓冲区的内容,并替代当前模板块中的文本;
G :获得内存缓冲区的内容,并追加到当前模板块文本的后面;

这是sed一些高级用法,目前用到的不是特别多,都是组合起来使用,以下实例把passwd内容以倒序的方式展现出来,类似于tac passwd

[root@master ~]# sed '1!G;h;$!d' passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

g G 复制/附加保持空间的内容到模式空间

h H 复制/附加模式空间的内容到保持空间

执行第一行,保存第一行保持空间,清除模式空间

执行第二行,保存第二行+第一行到保持空间,清除模式空间

执行第三行,保存第三行+第二行+第一行到保持空间,清除模式空间

l :列表不能打印字符的清单;
n :读取下一个输入行,用下一个命令处理新的行而不是用第一个命令;

n和N是sed高级用法,读取到匹配行后添加自定义的文本,以下实例可以很好理解

[root@master ~]# sed 'N;asong' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
song
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
song
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
song
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

解释:

  1. 读取1进模式空间

  2. 执行命令N

    1. 读取2并附加到模式空间,当前模式空间内容为“1\n2”

  3. 执行命令a—

    1. 在模式空间后附加一行‘—’当前模式空间内容为“1\n2\n—"

  4. 打印模式空间内容

  5. 循环执行直到读取11进模式空间,11的具体过程如下

    1. 读取11进模式空间

    2. 执行命令N,不过读取不到下一行

    3. 因为读不到,所以sed退出所有的命令,也就是说它不会执行命令a

    4. 加回换行符并打印模式空间的内容到输出,当前模式空间内容为11,所以输出11

  6. 已经是文件尾,sed结束运行。 

N :追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码;
r :在文件的匹配行之后插入另外一个文件的内容

意思是我查找passwd一个关键字yunwei,系统找到然后插入另外一个文件的内容,看实例就明白了

[root@master ~]# sed '/shutdown/r /root/pom.xml' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

三、匹配字符

^       锚定行的开始. 如/^sed/ 匹配所有以sed开头的行
$       锚定行的结束. 如/sed$/ 匹配所有以sed结尾的行
.         匹配一个非换行符. 如/*sed/ 匹配s后接一个任意字符然后是d
*        匹配零或多个字符. 如/*sed/ 匹配所有模块是一个或多个空格后紧跟sed的行
[]      匹配一个制定范围内的字符如. /[Ss]ed/ 匹配sed和Sed
[^]    匹配一个不在制定范围内的字符. 如/[^A-RT-Z]ed/ 匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行
\(..\)        保存匹配的字符. 如s/\(love\)able/\1rs loveable被替换成lovers
&              保存搜索字符用来替换其它字符. 如s/love/**&**/ love这成**love**
\<             锚定单词的开始. 如/\\> 锚定单词的结束. 如/love\>匹配包含以love结尾的单词行
x\{m\}       重复字符x,m次. 如/o\{5\}匹配包含5个o的行
x\{m,\}      重复字符x,至少m次. 如 /o\{5,}/匹配至少有5个o的行
x\{m,n\}    重复字符x,至少m次.把多余n次. 如 /o\{5,10\}/匹配5-10个o的行

四、补充

删除: dd命令
sed '2d' passwd                 删除passwd文件的第2行
sed '2,$d' passwd             删除passwd文件的第2行到末尾所有行
sed '$d' passwd                删除passwd文件的最后一行
sed '/nologin/'d passwd         删除passwd文件所有包含nologin的行
sed d passwd                   删除passwd文件中的所有行
sed 2,5d passwd              删除passwd中的2-5行
sed /nologin/d passwd          删除passwd中包含字符串nologin所有的行

选定行的范围: 逗号
ssed -n '/login/,/nologin/p' passwd        所有在模块login和nologin所确定范围内的行都被打印

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三颗草丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值