Linux三剑客之sed
概述:
sed是Stream Editor (字符流编译器)的缩写,简称流编译器。sed是操作、过滤和转换文本内容的强大工具;其中常用功能包括结合正则表达式对文件实现快速增删改查,其中查询的功能中最常用的是过滤(过滤指定字符)、取行。
原理内容:
sed主要是对处理文本文件——逐行读取文件内容(sed模式空间处理内存数据),当读到匹配的行就根据指令输出到屏幕上,当读到不匹配的行就取消输出到屏幕上。
sed 选项 命令字符 文件内容 常用的命令选项: a:追加 向匹配行后面插入内容 c:更改 更改匹配行的内容 i:插入 向匹配行前插入内容 d:删除 删除匹配的内容 s:替换 替换掉匹配的内容(global:全局替换) p:打印 打印出匹配的内容,通常与-n选项和用 -r:使用扩展正则表达式 -e:多次编辑,不需要正则表达式 -f:后跟保存了sed指令的文件 -i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改 -n:取消默认输出
sed的匹配范围:
空地址 全文处理 单地址 指定某一行 /pattern/ 被匹配到的某一行 范围区间 10,20(表示第十行到二十行) 10,+5(表示第10行向下5行) 步长 1~2 表示1,3,5,7,9......(奇数行) 2~2 表示2,4,6,8......
实例
1、输出第二行和第三行的内容
[root@node1 ~]# sed -n "2,3p" test.sh # -n:表示取消默认输出,否则会输出所有内容 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
2、过滤出含有root的字符
[root@node1 ~]# sed -n "2,3p" test.sh root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
3、删除含有root的行。
[root@node1 ~]# sed -n "/game/p" test.sh games:x:12:100:games:/usr/games:/sbin/nologin [root@node1 ~]# sed -n "/game/d" test.sh -i # -i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
4、删除某几行
[root@node1 ~]# sed '25,$d' test.sh # 输出未删除的行,未对test.sh做任何操作 #! /bin/bash 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 [root@node1 ~]# sed -i '25,$d' test.sh # 不会输出任何内容,但是已经对test.sh文件做了处理——删除该文件中25行以后的行数
5、将文件中的root全部替换为ROOT
[root@node1 ~]# sed -n "/root/p" test.sh # 查看文件中root所在的行 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@node1 ~]# sed "s/root/ROOT/g" test.sh -i #全局替换 [root@node1 ~]# sed -n "/ROOT/p" test.sh ROOT:x:0:0:ROOT:/ROOT:/bin/bash operator:x:11:0:operator:/ROOT:/sbin/nologin operator:x:11:0:operator:/ROOT:/sbin/nologin 补充:将文件中的root全部替换为ROOT,并且将 [root@node1 ~]# sed -n "/etcd/p" test.sh # 首先查看文件中etcd所在的行 etcd:x:996:992:Etcd user:/home/etcd:/sbin/nologin [root@node1 ~]# sed -e "s/etcd/ETCD/g" test.sh -e "s/root/ROOT/g" -i # 同时替换两个内容 [root@node1 ~]# sed -n "/ETCD/p" test.sh ETCD:x:996:992:Etcd user:/home/ETCD:/sbin/nologin
6、添加文件
[root@node1 ~]# sed "2a ETCD:x:996:992:Etcd user:/home/ETCD:/sbin/nologin" test.sh # 把ETCD:x:996:992:Etcd user:/home/ETCD:/sbin/nologin这行内容添加到文件的第三行,但是不对文本做任何操作 # a:表示在某一行后插入 ROOT:x:0:0:ROOT:/ROOT:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin ETCD:x:996:992:Etcd user:/home/ETCD:/sbin/nologin [root@node1 ~]# sed -i "2a ETCD:x:996:992:Etcd user:/home/ETCD:/sbin/nologin" test.sh # 把ETCD:x:996:992:Etcd user:/home/ETCD:/sbin/nologin这行内容添加到文件的第二行的后一行,sed操作写入文件中 # i:表示在某一行前加入 [root@node1 ~]# sed -i "2i ETCD:x:996:992:Etcd user:/home/ETCD:/sbin/nologin" test.sh # 把ETCD:x:996:992:Etcd user:/home/ETCD:/sbin/nologin这行内容添加到文件的第二行的前一行,sed操作写入文件中 # 如果需要插入多行内容—— \n+下一行内容
7、取出eth0中的IP地址
[root@node1 ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.4 netmask 255.255.255.0 broadcast 10.0.0.255 inet6 fe80::216:3eff:fe38:7026 prefixlen 64 scopeid 0x20<link> ether 00:16:3e:38:70:26 txqueuelen 1000 (Ethernet) RX packets 9979184 bytes 4226920510 (3.9 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8305305 bytes 722871000 (689.3 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@node1 ~]# ifconfig eth0 | sed -n "2p" | sed "s/^.*inet//" | sed "s/net.*$//" 10.0.0.4 # 获取该网卡信息 截取第二行 去掉ip地址之前字符 去掉ip地址之前字符 [root@node1 ~]# ifconfig eth0 | sed -e "2s/^.*inet//" -n -e "2s/net.*//p" -n 10.0.0.4