一、sed(流编辑器)
是操作、过滤和转换文本内容的强大工具。常用功能有对文件实现快速增删改查,其中查询的功能中最常用的2大功能是过滤(过滤指定字符串)和取行(取出指定行)
最强2大的是取行和替换*
1、语法格式
sed [选项] [sed内置命令字符] [输入文件]
-
-n:取消默认sed的输出,常于sed内置命令的p连用(输出想要的内容)
-
p:全拼print,表示打印匹配行的内容,通常p会与选项-n一起使用
-
-i:直接修改文件内容,而不是输出到终端。如果不使用-i选项sed只是修改在内存中的数据,并不会影响磁盘上的文件。修改前备份,cp,-i.bak
-
-e:允许多次编辑
-
-r:支持扩展正则表达式
2、内置命令符:
- p:打印
- d:delete删除
- =:行号
- ()\1 后向引用
3、【替换】
- s 替换
- g 全局
4、插入(了解)
- a:apend追加
- i:insert插入
5、测试:
(1)取ql.txt 4行
(1)sed -n '2,4p' ql.txt
(2)head -4 ql.txt |tail -1 #使用
head -4 ql.txt
获取文件的前 4 行。再通过tail -1
从这 4 行中取最后 1 行,也就是第 4 行。(3)awk 'NR==4' ql.txt
(2)过滤出含有oldboy字符串的行(格式'//p')
方法一:
方法二:
(3)删除含有oldboy字符串的行
sed '/oldboy/d' ql.txt #如果加n就不会输出了
(4)删除2-4行
sed '2,4d' ql.txt
(5)修改文件并备份
[root@qulan test]# cp ql.txt{,.ori}
[root@qulan test]# ls
b.txt ql.txt ql.txt.ori
[root@qulan test]# sed "/oldboy/d" ql.txt
I am ql student!
I study linux.I like badminton ball ,billiard ball and chinese chess!
my qq num is 49000448.not 4900000448.
my god ,i am not oldbey,but OLDBOY!
:::
///
:d::f
[root@qulan test]# sed -i.bak "/oldboy/d" ql.txt
[root@qulan test]# ls
b.txt ql.txt ql.txt.bak ql.txt.ori
使用vimdiff ql.txt ql.txt.bak查看文件差异
(6)将文件中的oldboy字符串全部替换为oldgril。
sed -i.bak 's#oldboy#oldgril#g' ql.txt
(7)在ql.txt文件的第2行后追加文本。
sed -i '2a i am excellend.' ql.txt
(8)在2行插入,原来第2行移动到第3行
sed -i '2i i am is ql.' ql.txt
6、练习
(1)取/etc/passwd中的第5-15行,重定向到/test.txt
sed -n '5,15p' /etc/passwd >/test.txt
(2)把/test.txt中以/sbin/nologin结尾的,都修改为/bin/bash。
sed -i.bak 's#/sbin/nologin#/bin/bash#g' /test.txt
(3)查找包含nobody的行。
sed -n '/nobody/p' /test.txt
(4)在第8行,插入#i am excellent。
sed -i.bak '8i i am excellent' /test.txt
(5)删除9-14行,并修改文件。
sed -i.bak '9,14d' /test.txt
(6)在ql.txt文件的第2行插入两行文本。
sed '2i iam qulan.\ni like dance' ql.txt
生产场景:
在文件中增加参数配置
远程连接ssh工具,需要一定配置
[root@qulan ~]# egrep '#Port|#PermitRootLogin|UseDNS|GSSAPIAuthentication' /etc/ssh/sshd_config
- #Port 22 #默认22端口(可以改)
- #PermitRootLogin yes #禁止root远程登录,改为no
- GSSAPIAuthentication yes #解决连接慢,改为no
- #UseDNS yes #解决连接慢,改为no
二、应用案例取IP
问题1:取出Linux中执行ifconfig eth0后对应的IP地址(只能输出IP地址)
[root@qulan ~]# ifconfig eth0 |sed -n '2p'
inet 10.0.0.135 netmask 255.255.255.0 broadcast 10.0.0.255
方法1:利用正则加sed替换功能取IP
需要取出10.0.0.135
(1)取出IP前半部分(^.* inet)
[root@qulan ~]# ifconfig eth0 | sed -rn '2s#^.*inet ##gp'
10.0.0.135 netmask 255.255.255.0 broadcast 10.0.0.255
(2)取出IP后半部分( netmask.*$)
[root@qulan ~]# ifconfig eth0 |sed -rn '2s#^.*inet ##gp'|sed -rn 's# netmask.*$##gp'
10.0.0.135
练习:
1、取ip a结果中的第一块网卡ip
[root@qulan ~]# ip a |grep 'eth0$' |sed -rn 's#^.*inet ##gp' |sed -rn 's#/24.*$##gp'
10.0.0.135
[root@qulan ~]# ip a |sed -rn '9s#^.*inet ##gp' |sed -rn 's#/24.*$##gp'
10.0.0.135
用一个管道符(下面的后向引用):
[root@qulan ~]# ip a |sed -rn 's#^.*inet (.*)/24.*$#\1#gp'
10.0.0.135
2、取stat /etc/hosts中的数字权限644
[root@qulan ~]# stat /etc/hosts
文件:"/etc/hosts"
大小:158 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:16807249 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:net_conf_t:s0
最近访问:2024-06-03 15:56:02.220321274 +0800
最近更改:2013-06-07 22:31:32.000000000 +0800
最近改动:2024-03-17 15:00:23.400757219 +0800
创建时间:-
自己的方法:
[root@qulan ~]# stat /etc/hosts |sed -rn '4s#^.*\(0##gp'|sed -rn 's#/-rw.*$##gp'
644
[root@qulan ~]# stat /etc/hosts |grep '644' |sed -rn 's#^.*\(0##gp' |sed -rn 's#\/-rw.*$##gp'
644
用一条命令来实现取IP
后向引用:
想要的内容要用括号括起来匹配,因为好吧他拿出来。()\1
[root@qulan ~]# ifconfig eth0 |sed -rn 's#^.*inet (.*) netmask.*$#\1#gp'
10.0.0.135
[root@qulan ~]# stat /etc/hosts |sed -rn 's#^.*\(0(.*)/-rw.*$#\1#gp'
644