linux三剑客sed命令使用教程

sed是什么

sed 是 stream editor 的缩写,中文称之为“流编辑器”。

sed 命令是一个面向行处理的工具,它以“行”为处理单位,针对每一行进行处理,处理后的结果会输出到标准输出(STDOUT)。你会发现 sed 命令是很懂礼貌的一个命令,它不会对读取的文件做任何贸然的修改,而是将内容都输出到标准输出中。

sed原理

sed 命令是面向“行”进行处理的,每一次处理一行内容。处理时,sed 会把要处理的行存储在缓冲区中,接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。这个缓冲区被称为“模式空间”(pattern space)。

sed命令选项

选项说明
-e表示用指定命令或脚本来处理输入的文本文件
-f表示用指定的脚本文件来处理输入的文本文件
-h或–help 显示帮助
-n表示显示处理后的结果
-i直接编辑文本文件
-i.bak备份文本文件
-r,-E使用扩展正则表达式
-s将多个文件视为独立文件,而不是单个连续的长文件流

sed针对文件操作的命令

命令说明
a增加,在当前行下面增加一行指定内容
c替换,将选定行替换为指定内容
d删除,删除选定的行
i插入,在选定行上面插入一行指定内容
p打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容
s替换,替换指定字符
y字符转换

迁移符合条件的文本

在使用 sed 命令迁移符合条件的文本时,常用到以下参数

H复制到剪贴板
g G将剪贴板中的数据覆盖/追加至指定行
w保存为文件
r读取指定文件
a追加指定内容
l i忽略大小写

sed用法

在此之前,先看看原文件的内容

#我们先来看看原文件的内容
[roc@roclinux ~]$ cat 1.txt
test 1
test2
test3
test4
test5
1、模糊匹配

/the/ 包含 显示包含the的行

sed -n '/the/p' test.log

打印第4行开始有the的行

sed -n '4,/the/p' test.log

打印出现the所在行号

sed -n '/the/=' test.log

显示the开头的行

sed -n '/^the/p' test.log

显示数字0-9结尾的行

sed -n '/[0-9]$/p' test.log

模糊匹配删除

 删除文件中带字符“2”的行
 sed '/2/d' roc.txt

删除后的文件内容

[roc@roclinux ~]$ cat 1.txt
test 1
test3
test4
test5
2、提取某一列数据

先来一起看看/etc/passwd文件的内容

[root@master home]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
#我们这回用sed命令来提取文件中每行的第一个域, 间隔符是冒号
[root@master home]# head -n 5 /etc/passwd|sed 's/:.*$//'
root
bin
daemon
adm
lp
3、筛选行

显示 test.log 文件的第 10 行到第 20 行的内容

 sed -n '10,20p' test.log

显示第4行的内容

sed -n '4p' test.log
cat test.log | sed -n 4p

输出文件所有内容

显示所有奇数行

sed -n 'p;n' 1.txt

显示所有偶数行

sed -n 'n;p' 1.txt
4、替换

将所有以 d 或 D 开头的行里的所有小写 x 字符变为大写 X 字符

sed '/^[dD]/s/x/X/g' test
5、删除每行的最后两个字符
# 点号表示一个单个字符, 两个点号就表示两个单个字符
sed 's/..$//' test
6、删除每一行的前两个字符
sed 's/..//' test
7、展示匹配行之间的内容

展示匹配了2005的行和2007的行之间的内容

#文件内容展示一下
[roc@roclinux ~]$ cat mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
Beijing 2007
 
#我们想展示匹配了2005的行和2007的行之间的内容
[roc@roclinux ~]$ sed -n ‘/2005/,/2007/p’ mysed.txt
Beijing 2005
Beijing 2006
Beijing 2007
8、-e选项设置多个command

有一个地方值得大家注意,那就是-e选项的后面要立即接 command 内容,不允许再夹杂其他选项。

#文件内容展示一下
[roc@roclinux ~]$ cat mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
Beijing 2007

#我们通过2个-e选项设置了两个command,展示第1、2、4行的内容
[roc@roclinux ~]$ sed -n -e ‘1,2p’ -e ‘4p’ mysed.txt
Beijing 2003
Beijing 2004
Beijing 2006
9、插入内容
9.1、插入另一个文件的所有内容 r\
#将要插入的内容保存到一个单独的文件中
[roc@roclinux ~]$ cat ins.txt
====China====
 
#展示一下要处理的文件
[roc@roclinux ~]$ cat mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
 
#使用r来实现插入 ,将ins.txt的内容插入到 mysed.txt的2005所在行的下面
[roc@roclinux ~]$ sed ‘/2005/r ins.txt’ mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
====China====
Beijing 2006
Beijing 2007
Beijing 2008
9.2、在下一行插入指定内容 a\
#在2004的下一行插入China
[roc@roclinux ~]$ sed ‘/2004/a\China’ mysed.txt
Beijing 2003
Beijing 2004
China
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
9.3、在上一行插入内容 i\
[roc@roclinux ~]$ sed ‘/2004/i\China’ mysed.txt
Beijing 2003
China
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008 
10、替换 y/
#原文件内容
[roc@roclinux ~]$ cat mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
 
# y 就是按照字符顺序, 实现前后的替换,看上去是将所有的 "ei" 替换为 "ie",其实是将e换成i,将i换成e
[roc@roclinux 20160229]$ sed 'y/ei/ie/' mysed.txt
Biejeng 2003
Biejeng 2004
Biejeng 2005
Biejeng 2006
Biejeng 2007
Biejeng 2008

在举例,如果换成y/ee/ei/ 会产生什么效果呢?

[roc@roclinux 20160229]$ sed 'y/ee/ie/' mysed.txt
Biijing 2003
Biijing 2004
Biijing 2005
Biijing 2006
Biijing 2007
Biijing 2008

# 原理,表面上看好像是将ee换成ie,其实替换的时候是单个替换的,
# 也就是将ee中的第一个e换成ie中的第一个i,
# 将ee第二个e换成ie中的第二个e,替换原理如下
 e    e
 ↓    ↓
 换   换
 成   成
 ↓    ↓
 i    e
11、将指定行写入到特定文件中
#将包含2004、2005、2006的行保存到new.txt文件中
[roc@roclinux ~]$ sed ‘/200[4-6]/w new.txt’ mysed.txt
Beijing 2003
Beijing 2004
Beijing 2005
Beijing 2006
Beijing 2007
Beijing 2008
 
#我们要的内容已经乖乖到碗里来了
[roc@roclinux ~]$ cat new.txt
Beijing 2004
Beijing 2005
Beijing 2006
12、修改文件内容 -i

想要直接修改文件内容,只需要加个-i 参数即可,例如

#删除文件中带字符“2”的行
sed -i '/2/d' roc.txt
13、追加内容 a

在第3行下追加指定内容,,其中yexindong是新加的内容,3表示第三行,a表示追加

sed '3ayexindong' roc.txt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

java叶新东

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

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

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

打赏作者

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

抵扣说明:

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

余额充值