linux-shell编程三剑客之--sed

本文介绍了Linux Shell编程中的重要工具sed,包括常用选项、命令,如行号查找、模式查找和替换标记。讲解了如何取奇数行和偶数行,以及sed的高级用法,如模式空间、缓存空间和标签的运用。通过实例展示了sed在处理文件内容时的灵活性,如将uid后面加个0,gid前面加个1,以及如何交换包含邮箱的列中的邮箱和名字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tzk_shell三剑客(sed awk grep)

sed --》 sed [选项] [命令] [文件]

常用选项:
-n:只显示匹配处理的行
-i:直接在文件中进行修改
-r:对扩展正则的支持(基本正则中:^$\d这样的元字符很少)
常用命令:
p:打印匹配行print   --》常和-n联用
d:删除指定行delete
a:在匹配行的下面一行追加append
i:在匹配行前面插入insert
c:整行替换
r:将文件的内容读入read
w:将文件写入文件write
s:字符串替换
N:将下一行一起读入模式空间作为一行\n分隔

sed -n ‘10,15p’ t1.txt

sed -n ‘1p;3p;5p’ t1.txt

# -r  -w这两个比较拗口
sed -i '/luhaisen/r sed.txt' name.txt  
#将sed.txt的内容导入到name.txt文件里的luhaisen行的后面

sed -i '1,5w sed.txt'  name.txt  
#将name.txt的1到5行的内容写入到sed.txt文件里,会覆盖里面的内容
sed的单引号和双引号
双引号里可以使用shell里的变量
	单引号不行
	单引号和双引号里都可以存放模式
[root@cali 5_23]# a=5
[root@cali 5_23]# b=10
[root@cali 5_23]# cat -n passwd |sed -n "${a}p;${b}p"
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    10	uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@cali 5_23]#
[root@cali 5_23]# cat -n passwd |sed -n '${a}p;${b}p'
sed: -e expression #1, char 0: unmatched `{'
[root@cali 5_23]#

sed查找方式
  • 行号查找 :sed -n ‘/bash/p’ /etc/passwd

  • 模式查找 :

    sed -n -r  '/.* ***tzk.****bash/p'  /etc/passwd
    sed  -nr  '/^[^0-9]/p'  /etc/passwd
               已不是数字开头的
    ,逗号是连接符、:取两个模式之间的数据用,逗号隔开
    !感叹号是取反符
    
sed中的三种替换标记:g/p/w
  • sed -n [行号或模式]s/查找内容/替换内容/[替换标记] 文件

数字:替换每行的第几个
g:全局替换,否则只替换一行中第一个字符串。例如ng从第n个开始替换
p:显示被执行替换操作的行和-n合用
w:将执行替换操作的行输出到指定文件

#### sed中的s命令

将文件中每行的第2个root替换为ROOT

​```shell
sed -n 's/root/ROOT/2p' /etc/passwd

将文件中找到以id开头的行中的:3:替换成:5:

sed '/^id/s/:3:/:5:/' /etc/inittab

禁止本地用户登陆

sed  '/^local_enable/s/YES/NO/'  vsftpd.conf

将文件中的:号替换为换行符

sed 's/:/\n/g' /etc/passwd

将文件中bash替换成nologin,同时将sbin替换成bin

sed 's/bash/nologin/;s/sbin/bin/' /etc/passwd

在前面加元素,和后面加元素

sed -n '2,10s/^/#/p' passwd
#在2到10行前面加上注释
sed -n 's/$/?/p' passwd
#在每行末尾加上?
sed取奇数行(12)、偶数行(22)
[root@nginx-bianyi lianxi]# cat passwd -n|sed -n '1~2p'
     1	root:x:0:0:root:/root:/bin/bash
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    11	games:x:12:100:games:/usr/games:/sbin/nologin
    13	nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
    15	systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
    17	tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    19	unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
    21	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@nginx-bianyi lianxi]# cat passwd -n|sed -n '2~2p'
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync
     8	halt:x:7:0:halt:/sbin:/sbin/halt
    10	operator:x:11:0:operator:/root:/sbin/nologin
    12	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    14	dbus:x:81:81:System message bus:/:/sbin/nologin
    16	systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
    18	polkitd:x:998:996:User for polkitd:/:/sbin/nologin
    20	sssd:x:996:993:User for sssd:/:/sbin/nologin
    22	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
小练习:
#1.在每行前面加一个字符串

#2.一个文件
#		0.0.0.0
#		1.1.1.1
#		2.2.2.2
#		输出以下形式:
#		0.0.0.0:80,1.1.1.1:80,2.2.2.2:80

# 答:
sed -i 's/$/:80/;N;N;s/\n/,/' t1.sh

# 把passwd文件前的数字和空格全部去掉
cat -n passwd |sed -nr 's/\s+[0-9]+\s+//p'

sed高级用法

模式空间(pattern space)、缓存空间(hold space)

在这里插入图片描述

标签的用法

1、将passwd中的uid后面加个0,gid前面加个1

cat passwd |sed -nr '/^root/!s/([0-9]+):([0-9]+)/\10:1\2/p'

2、将文件里的a.txt里的内容
1
2
3
4
5
修改为 sc:5 sc:4 sc:3 sc:2 sc:1

 sed -i -r 'N;N;N;N;s/\n/ /g;s/([0-9])+\s([0-9])+\s([0-9])+\s([0-9])+\s([0-9])+/sc:\5 sc:\4 sc:\3 sc:\2 sc:\1/' a.txt
sed中正则灵活使用
将有邮箱的列把邮箱和后面的名字交换
[root@sanchuang-sed lianxi]# cat test.txt
0.0.0.0
1.1.1.1
2.2.2.2
https://www.baidu.com/map/feng.htm
https://www.qq.com/sanchuang/tan.html
https://www.163.com/lihu/li.htm
tan123@sc.com  tanzikun
feng_dy@sina.com  cali
ran123@163.com  ran
cali@facebook.cn  califeng
[root@sanchuang-sed lianxi]# cat test.txt|sed -n 's/(\w+@\w+\.[a-Z]+)(.*)/\2 \1/p'
tanzikun tan123@sc.com
cali feng_dy@sina.com
ran ran123@163.com
califeng cali@facebook.cn

在这里,其实使用awk更加便利
–》》》awk的使用

[root@sanchuang-sed lianxi]# cat test.txt|awk '/@/{print $2,$1}'
tanzikun tan123@sc.com
cali feng_dy@sina.com
ran ran123@163.com
califeng cali@facebook.cn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值