马哥12-文本处理三剑客之sed

什么是sed?

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓存区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使用诸如'D'的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
参考网址:http://www.gnu.org/software/sed/manual/sed.html

sed [OPTION] ‘Script’ inputfile

OPTION用途
-n不输出模式空间的内容到屏幕,即关闭自动打印
-e多点编辑,即执行多条命令
-f /PATH/SCRIPT_FILE从指定的文件中读取编辑脚本
-r使用正则表达式
-i.bak单独-i是编辑修改文件内容,-i.bak修改文件前进行备份

‘script’——‘地址命令’

符号用途
‘NUM’指定NUM行
‘$’最后一行
‘/PATTERN/’被匹配到的每一行
‘NUM,NUM’范围的行,即多少行到多少行
‘NUM1,+NUM’范围行,即从NUM1行往后+NUM行
‘PATTERN’,‘PATTERN’被匹配到的范围的行,即匹配到数据到匹配到另一个数据之间的行
‘NUM,/PATTERN/’从第NUM行到被匹配到数据的范围的行
‘1~2’步进,12奇数行
‘2~2’步进,22偶数行

‘script’——‘编辑命令’

符号用途
d删除模式空间匹配的行,并立即启用下一轮循环
p打印当前模式空间内容,追加到默认输出之后
a[\]text在指定行后面追加文本,支持使用\n实现多行追加(追加多行在每行后面加换行符\n即可)
i[\]text在指定行前面插入文本,支持使用\n实现多行追加(追加多行在每行后面加换行符\n即可),
c[\]text替换行为单位或多行文本
w /PATH/FILE保存模式匹配的行至指定文件(将匹配到的行的数据另存文件)
r /PATH/FILE读取指定文件的文本至模式空间中匹配的行后(把指定文本的数据读取到匹配行的后面)
=为模式空间中的行打印行号
对模式空间中匹配到的行进行取反(除了匹配到的行以外其他的行)

‘script’——‘搜索替换’

符号用途
‘s/匹配文本/替换文本/标记’查找替换也可以使用s@@@或者s###
‘s/匹配文本/替换文本/g’全部替换
‘s/匹配文本/替换文本/p’显示替换成功的行
‘s/匹配文本/替换文本/w FILE’替换成功的行保存到文件

范例

[root@localhost ~]#seq 10 | sed '2~2d;1d'
3
5
7
9


[root@localhost ~]#seq 10 | sed '2~2a\   7788'
1
2
   7788
3
4
   7788
5
6
   7788
7
8
   7788
9
10
   7788

`1. 添加文本到文件`
[root@localhost ~]#sed '/# User specific/ialias' .bashrc
# .bashrc

alias---------------`添加的文件`
# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

`2. 搜索替换`
[root@localhost ~]#sed -n 's/\(UUID\)/Error/p' /etc/fstab
Error=4c01a418-3b33-4271-9a19-0ff2895e7654 /                       xfs     defaults        0 0
Error=219c85c0-a0ef-4ee3-9613-3da9cda5e048 /boot                   xfs     defaults        0 0
Error=ae1302a1-04bb-447f-99ad-f7f84a16b06d /data                   xfs     defaults        0 0
Error=5da7cfd1-2490-4dfc-a0bb-5e7135a16f7c swap                    swap    defaults        0 0

`3. -r`
[root@localhost ~]#grep 'root' /etc/passwd | sed -r 's/(root)/\1er/g'
rooter:x:0:0:rooter:/rooter:/bin/bash
operator:x:11:0:operator:/rooter:/sbin/nologin

`4. ifconfig拿出IP`
[root@localhost ~]#ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+) .*/\1/p'
192.168.88.131

`修改网卡名eth0`
[root@localhost ~]#sed -ri.bak 's/(linux16.*)/\1 net.ifnames=0/' /boot/grub2/grub.cfg /boot/grub2/grub.cfg

‘script’——‘通往月薪20K道路之一之高级编辑命令’

符号用途
P打印到输出之前
h把模式空间的内容放到保持空间
H把模式空间内容追加到保持空间
g把保持空间内容覆盖到模式空间
G把保持空间内容追加到模式空间
x模式空间与保持空间的内容进行互换
n匹配的下一行覆盖到模式空间
N匹配的下一行追加到模式空间
d删除模式空间的行
D如果模式空间有换行符,不读取新行,重新使用模式空间

sed高级命令示例

#sed -n 'n;p' FILE
[root@localhost /data/script]#sed -n 'n;p' f1 
2
4
6
8
10

#sed '1!G;h;$!d' FILE
[root@localhost /data/script]#sed '1!G;h;$!d' f1 
10
9
8
7
6
5
4
3
2
1

#sed 'N;D'FILE
[root@localhost /data/script]#sed 'N;D' f1 
10

#sed '$!N;$!D' FILE
[root@localhost /data/script]#sed '$!N;$!D' f1 
9
10

#sed '$!d' FILE
[root@localhost /data/script]# sed '$!d' f1 
10

#sed 'G' FILE
[root@localhost /data/script]#sed 'G' f1 
1

2

3

4

5

6

7

8

9

10



#sed 'g' FILE
[root@localhost /data/script]#sed 'g' f1 













#sed '/^$/d;G' FILE
[root@localhost /data/script]#sed  '/^$/d;G' f1 
1

2

3

4

5

6

7

8

9

10



#sed 'n;d' FILE
[root@localhost /data/script]#sed 'n;d' f1 
1
3
5
7
9

#sed -n '1!G;h;$p' FILE
[root@localhost /data/script]#sed -n '1!G;h;$p' f1 
10
9
8
7
6
5
4
3
2
1

课后练习

1、删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符
[root@localhost /data/script]#sed -nr 's/^[[:blank:]]+//pg' ./grub2.cfg

2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符[root@localhost /data/script]#sed -nr 's/^#[[:blank:]]+//pg' ./grub2.cfg

3、在centos6系统/root/install.log每一行行首增加#号
[root@localhost /data/script]#sed -nr 's/^[[:blank:]]+//pg' ./grub2.cfg
长度/
4、在/etc/fstab文件中不以#开头的行的行首增加#号
[root@localhost /etc]# sed -r 's@^[^#]@#&@p' /etc/fstab

5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
目录:[root@localhost /etc]#echo "/etc/fstab"|sed -r 's#^(.*/)([^/]+/?)#\1#'

基名:[root@localhost /etc]#echo "/etc/fstab"|sed -r 's#^(.*/)([^/]+/?)#\2#'

6、利用sed 取出ifconfig命令中本机的IPv4地址
[root@localhost /etc]#ifconfig |sed -n '/broadcast/'p|sed -r 's/.*inet\ (.*)\ netmask.*/\1/'

7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
1.[root@localhost ~]#ls *.rpm|sed -r 's#^.*\.([^.]+)\.rpm$#\1#'|sort|uniq -c
2.[root@localhost ~]#ls *.rpm|sed -r 's#^.*\.([^.]+)\.rpm$#\1#'|sort|uniq -c

8、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)
1.[root@magedu ~]# egrep -o "[[:alpha:]]+" /etc/init.d/functions| sort | uniq -c | sort -nr
2.[root@magedu ~]# sed -r "s/[^[:alpha:]]/\n/g" /etc/init.d/functions| sort | uniq -c | sort
-nr
9、将文本文件的n和n+1行合并为一行,n为奇数行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值