Linux中的shell高级部分之sed操作超详细教学

sed流编辑器,Stream Editor)是 Unix/Linux 系统中强大的文本处理工具,擅长对文本进行替换、删除、插入、提取等操作。它逐行处理输入数据,执行指定的编辑命令,并将结果输出到标准输出,适合自动化处理大量文本。

sed操作 --实现过滤和替换

可以进行查询操作

命令含义

sed 可选项 目标文件

对目标文件 进行 过滤查询替换

可选参数

可选项英文含义
p

print

打印
$

代表 最后一行

-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修改内容

参数英文含义
iinsert

目标前面 插入内容

aappend

目标后面 追加内容

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值