sed
(流编辑器,Stream Editor)是 Unix/Linux 系统中强大的文本处理工具,擅长对文本进行替换、删除、插入、提取等操作。它逐行处理输入数据,执行指定的编辑命令,并将结果输出到标准输出,适合自动化处理大量文本。
sed操作 --实现过滤和替换
可以进行查询操作
命令 | 含义 |
sed 可选项 目标文件 |
对目标文件 进行 过滤查询 或 替换 |
可选参数
可选项 | 英文 | 含义 |
p |
| 打印 |
$ |
代表 最后一行 | |
-n |
仅显示处理后的结果 | |
-e |
expression |
根据表达式 进行处理 |
创造点数据6.txt
aaa java root
bbb hello
ccc rt
ddd root nologin
eee rtt
fff ROOT nologin
ggg rttt
列出6.txt中的3~5行的数据
cat 6.txt | sed -n -e '3,5p'
假如没有学过sed可以这么干:
head -5 6.txt | tail -3
显示第一行到最后1行的数据:
cat 6.txt | sed -n -e '1,$p'
显示行号:
可选项 | 含义 |
= |
打印当前行号 |
打印第三行到第五航的数据,显示行号
一种写法,没有使用sed ,而是使用了cat -n
cat -n 6.txt|sed -n -e '3,5p'
另一种写法:
sed -n -e '3,5=' -e '3,5p' 6.txt
sed进行查找
// 需求是查找每一行中包含login的数据
cat 6.txt | sed -n -e '/login/p'
cat 6.txt| grep login
[root@bigdata01 gaoji]# grep -n login 6.txt
4:ddd root nologin
6:fff ROOT nologin
[root@bigdata01 gaoji]# awk '/login/' 6.txt
ddd root nologin
fff ROOT nologin
[root@bigdata01 gaoji]# sed -n -e '/login/p' 6.txt
ddd root nologin
fff ROOT nologin
不区分大小写的查找,使用 I 参数 (大i)
Sed 中可以使用正则表达式
cat 6.txt|sed -n -r -e '/r+t/p'
-r 后面可以跟正则表达式
r+ 表示 r 可以出现一次到多次 r后面必须跟上t
思考: 在这个里面如何写一个正则表达式,表示以r开头,以t结尾
a* a出现0次到多次
a+ a出现1次到多次
Sed 进行删除操作:
先学习一个新命令 nl 可以查看文件,该文件自动添加行号
选项使用d 进行删除
显示除了3到5行的所有数据:
nl 6.txt | sed -e '3,5d'
nl 6.txt | sed -e '3,$d' // 只显示前两行数据了
[root@bigdata01 datas]# cat 6.txt | sed -e '3,$d' | cut -d ' ' -f 2
java
hello
还可以使用sed修改内容
参数 | 英文 | 含义 |
i | insert |
目标前面 插入内容 |
a | append |
目标后面 追加内容 |
1、在6.txt的第一行前面插入 xxxxxxx,并显示行号
nl 6.txt | sed -e '1i xxxxxxxx'
2、在6.txt的第二行后面插入 SSSSSSS,并显示行号
nl 6.txt | sed -e '2a SSSSSSSS'
sed还可以进行数据的替换
s/oldString/newString/ | replace | 替换 |
把6.txt中的nologin替换成为huawei,并显示行号
cat 6.txt | sed -e 's/nologin/huawei/' // 按照字符串进行替换
cat 6.txt | sed -e '3c xiaoran' // 按照行进行替换
以上的替换都是没有修改原来的数据的,sed也可以直接对原数据进行直接更改。
直接更改数据,首先数据进行备份
cp 6.txt 7.txt
sed -i -e 's/nologin/huawei/' 7.txt
sed -i -e '2c laoyanlaoyan' 7.txt
sed -i -e '1,2d' 7.txt // 真删除数据
Sed综合练习:获取本机的IP地址
ifconfig 在 linux上可以获取本机的IP信息
ipconfig 在windows上可以获取IP地址信息
因为我使用的是mini版,没有这个服务:
yum search ifconfig
yum install -y net-tools.x86_64
安装完毕就可以使用ifconfig 这个服务了。
符号 | 含义 | |
^ | 表示开始 |
^aaa 表示以 aaa 开始 |
$ | 表示结尾 |
bbb$ 表示以 bbb 结尾 |
.* | 表示任意 |
^.* 表示以 任意字符开始 |
需求是:通过ifconfig 命令获取我的IP地址
ifconfig ens33 | grep 'inet ' | sed -e 's/inet //' | sed -e 's/ netmask.*//'
也可以这么写: \s 表示空格 * 表示0次到多次
ifconfig ens33 | grep 'inet ' | sed -e 's/\s*inet //' | sed -e 's/\s*netmask.*//'
思考:
ip addr 获取ip地址,怎么写?
ip addr | grep ens33 |grep 'inet' | sed -e 's/\s*inet //' | sed -e 's/\/.*//'
案例补充:
查找以d开头的内容:
[root@bigdata01 datas]# sed -n -e '/^d/p' 6.txt
ddd root nologin
以p开头的行前加[TAB]:注意此时的文件名字叫a
tab 键 是缩进的,比 空格 要大
$ cat a
pa:11:a
sa:32:c
app:5:b
stort:1:d
pear:4:aa
hello:3:f
$ sed '/^p/s/^/\t/' a
pa:11:a
sa:32:c
app:5:b
stort:1:d
pear:4:aa
hello:3:f
删除以a开头的行,(那么下面的输出,以a开头的行就没了)
$ sed '/^a/d' a
pa:11:a
sa:32:c
stort:1:d
pear:4:aa
hello:3:f
反向匹配(文件a中,输出只保留了a开头的行):
$ sed '/^a/!d' a
app:5:b