shell脚本文本三剑客之Sed

shell脚本文本三剑客之Sed

什么是Sed?

  • sed编辑器时一种****流编辑器*,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来*编辑数据流****。

  • sed编辑器可以根据命令来处理数据流中的数据,这些命令****要么从命令行中输入,要存储在一个命令文本文件中****。

Sed的工作流程

sed 的工作流程主要包括读取、执行和显示三个过程: 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。 执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed 命令 将会在所有的行上依次执行。 显示font>:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。

Sed的基本用法
sed -e '操作' 文件1 文件2
 
sed -n -e '操作' 文件1 文件2 
 
sed -f 脚本文件 文件1 文件2 
 
sed -i -e '操作' 文件1 文件2
Sed常用选项
-e 或 - -expression=∶ 多点编辑

-f 或- -file=∶表示用指定的脚本文件来处理输入的文本文件。

-h 或- -help∶显示帮助。

-n∶ 不输出模式空间内容到屏幕,即不自动打印,加p,又恢复自动打印

-i∶ 备份文件文件并原处编辑

-r:使用扩展正则表达式
Sed的常用操作
s∶替换,替换指定字符。

d∶删除,删除选定的行。

a∶ 增加,在当前行下面增加一行指定内容。

i∶ 插入,在选定行上面插入一行指定内容。

c∶ 替换,将选定行替换为指定内容。

Y∶ 字符转换,转换前后的字符长度必须相同。

p∶ 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容; 如果有非打印字符,则以 AscII码输出。其通常与_n"选项一起使用。

=∶打印行号。

l(小写L)∶打印数据流中的文本和不可打印的ASCII字符(比如结束符s、制表符\t)

Sed命令使用

打印全部内容
sed ‘ ’交互模式输入一行,自动打印一行相同的

sed -n ‘ ’ 交互模式输入一行,关闭自动打印

sed -n ‘ p’加上p又恢复自动打印
[root@sdh opt]#sed ' '
11
11
22
22
33
33
44
44
[root@sdh opt]#sed -n ' '
11
22
33
[root@sdh opt]#sed -n ' p'
11
11
22
22
33
33
查看文件,打印全部内容
#法一:
[root@sdh opt]#sed ' ' /etc/fstab 
 
#
# /etc/fstab
# Created by anaconda on Sat Sep  4 02:48:23 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=183ca7c7-1989-4f43-9e81-d2676192f5a4 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sdb1 /mnt xfs defaults 0 0
 
#法二
[root@sdh opt]#sed -n ' p' /etc/fstab 
 
#
# /etc/fstab
# Created by anaconda on Sat Sep  4 02:48:23 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=183ca7c7-1989-4f43-9e81-d2676192f5a4 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sdb1 /mnt xfs defaults 0 0
打印指定行内容
##例如:打印第四行内容
[root@sdh opt]#sed -n ' 4p' /etc/fstab 
# Created by anaconda on Sat Sep  4 02:48:23 2021
 
[root@sdh opt]#ifconfig ens33|sed -n '2p'
        inet 192.168.59.102  netmask 255.255.255.0  broadcast 192.168.59.255
根据地址打印指定多行内容
#打印2-4行
[root@sdh opt]#ifconfig ens33|sed -n '2,4p'
        inet 192.168.59.102  netmask 255.255.255.0  broadcast 192.168.59.255
        inet6 fe80::ecee:9f8a:52de:5871  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:3e:22:fe  txqueuelen 1000  (Ethernet)
 
#打印2行加4行,就是打印第二行到第6行
[root@sdh opt]#cat -n /etc/passwd|sed -n '2,+4p'
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync
打印多行后退出
[root@sdh opt]#sed  '3q' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
打印最后一行,使用通配符$
[root@sdh opt]#sed -n '$p' /etc/passwd
dhcpd:x:177:177:DHCP server:/:/sbin/nologin
支持正则表达式
#查找基本格式:
sed -n '//,//p' 文件名
第一个//表示开头位置,第二个//表示结尾位置
[root@sdh opt]#sed -n '/^r/,/^f/p' /etc/passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin
saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin
setroubleshoot:x:995:993::/var/lib/setroubleshoot:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
chrony:x:994:990::/var/lib/chrony:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
geoclue:x:993:988:User for geoclue:/var/lib/geoclue:/sbin/nologin
sssd:x:992:987:User for sssd:/:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:991:986::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
dhcpd:x:177:177:DHCP server:/:/sbin/nologin
过滤关键词
[root@sdh opt]#sed -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
‘#,/关键字/p’ 从第#行开始匹配
[root@sdh opt]#sed -n '2,/root/p' /etc/passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
‘/关键字/,#’ 找到第#个关键字为止
[root@sdh opt]#sed -n '/root/,3p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
打印文本的奇数和偶数行。
[root@sdh opt]#seq 10 |sed -n '1~2p'
1
3
5
7
9
[root@sdh opt]#seq 10 |sed -n '2~2p'
2
4
6
8
10
[root@sdh opt]#seq 10 |sed  '1~2d'
2
4
6
8
10
[root@sdh opt]#seq 10 |sed  '2~2d'
1
3
5
7
9
 
删除内容
删除指定行
#删除指定行并不是真正删除,只是将删除了的结果显示出来,并不是真正删除了
[root@sdh opt]#cat seq.txt 
1
2
3
4
5
6
7
8
9
10
[root@sdh opt]#cat seq.txt |sed '3d'
1
2
4
5
6
7
8
9
10
[root@sdh opt]#cat seq.txt 
1
2
3
4
5
6
7
8
9
10
删除指定的多行
[root@sdh opt]#sed '2,4d' seq.txt 
1
5
6
7
8
9
10
删除文本中的空行
[root@sdh ~]#sed '/^$/d' /opt/seq.txt 
1
2
3
4
5
6
7
8
9
10
删除以指定字符串结尾的行及取反。
[root@sdh ~]#sed '/nologin$/!d' /etc/passwd
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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
先备份内容再删除
[root@sdh opt]#sed -i.bak '3d' seq.txt 
[root@sdh opt]#cat seq.txt
1
2
4
5
6
7
8
9
10
[root@sdh opt]#cat seq.txt.bak 
1
2
3
4
5
6
7
8
9
10
插入内容
在指定行后插入
[root@sdh opt]#cat seq.txt
1
2
4
5
6
7
8
9
10
[root@sdh opt]#sed -i '2a hehe' seq.txt
[root@sdh opt]#cat seq.txt
1
2
hehe
4
5
6
7
8
9
10

插入空行,修改文件的换行,要多加一个\

[root@sdh opt]#cat seq.txt
1
2
hehe
4
5
6
7
8
9
10
[root@sdh opt]#sed -i '2a\\n hehe' seq.txt
[root@sdh opt]#cat seq.txt
1
2
 
 hehe
hehe
4
5
6
7
8
9
10
替换
[root@sdh opt]#sed -i '2chahahaha' seq.txt
[root@sdhp opt]#cat seq.txt
1
hahahaha
 
 hehe
hehe
4
5
6
7
8
9
10
取反
[root@sdh opt]#seq 10|sed -n '2!p'
1
3
4
5
6
7
8
9
10
搜索替代
格式:格式:sed 行范围 s/旧字符串/新字符串/替换标记
替换标记:

数字:表明新字符串将替换第几处匹配的地方

g : 表明新字符串将会替换所有匹配的地方

p : 打印与替换命令匹配的行,与 -n 一起使用

w 文件 :将替换的结果写到文件中
修改全局,后面加g
[root@sdh opt]#sed -i 's/root/admin/g' passwd 
分组调用
#分组使用()(),调用第一段使用\1
[root@sdh opt]#echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1/'
11
#调用第2个分组
[root@sdh opt]#echo 11aaxx |sed -r 's/(11)(aa)(xx)/\2/'
aa
#调用所有分组
[root@sdh opt]#echo 11aaxx |sed -r 's/(11)(aa)(xx)/\1\2\3/'
11aaxx
提取ip地址
[root@sdh ~]#ifconfig ens33 |sed -rn '2s/.*(inet) ([0-9.]+)  (netmask) ([0-9.]+)  (broadcast) ([0-9.]+).*/\2/p'
192.168.59.102
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值