魏蓝

以梦为马

导航

sed的高级用法

1.如何把网卡改成传统模式的网卡

1)第一步

*1.用后向引用

[root@centos7 ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
[root@centos7 ~]# sed -i -r '/GRUB_CMDLINE_LINUX=/s#(.*)"$#\1 net.ifnames=0"#' /etc/default/grub
[root@centos7 ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet net.ifnames=0"
GRUB_DISABLE_RECOVERY="true"

*2.不分组

sed -i -r '/GRUB_CMDLINE_LINUX=/s#"$# net.ifnames=0"#' /etc/default/grub

2)第二步

[root@centos7 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-1160.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-b57bc3ff91254e2dbb9727e060abf5c1
Found initrd image: /boot/initramfs-0-rescue-b57bc3ff91254e2dbb9727e060abf5c1.img
done

3)第三步

reboot

[root@centos7 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.93.128 netmask 255.255.255.0 broadcast 192.168.93.255
inet6 fe80::740b:d22d:a3bf:c253 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:82:be:a5 txqueuelen 1000 (Ethernet)
RX packets 144 bytes 31547 (30.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 124 bytes 18553 (18.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

 

 

 

2.怎么让自己的网卡写成一个固定的(需要完成1)

[root@centos7 ~]# cd /etc/sysconfig/network-scripts/
[root@centos7 network-scripts]# rm -rf ifcfg-ens33
[root@centos7 network-scripts]# touch ifcfg-eth0
[root@centos7 network-scripts]# vim ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.8  #每个主机IP不同
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.2
DNS2=180.76.76.76
ONBOOT=yes

 

 

 

3.sed命令还支持变量

[root@centos7 data]# name=root
[root@centos7 data]# sed -nr '/root/p' /etc/passwd     
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

 

现在我想知道用这种行不行

sed -nr '/$name/p' /etc/passwd

答案是不行,因为我们用的是单引号。那该怎么办:

1)换双引号

[root@centos7 data]# sed -nr "/$name/p" /etc/passwd     
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

2)在变量前后加单引号

[root@centos7 data]# sed -nr '/'$name'/p' /etc/passwd     
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

 

 

4.变量实现多点编辑配置文件

先安装一下这个

yum -y install httpd

然后更改/etc/httpd/conf/httpd.conf中的内容

[root@centos7 data]# port=8080
[root@centos7 data]# sed -ri.bak -e 's/^Listen 80/Listen '$port'/' -e "/ServerName/c ServerName `hostname`:$port" /etc/httpd/conf/httpd.conf

 

 

 

5.q退出sed

[root@centos7 data]# seq 10 > test.txt
[root@centos7 data]# sed 5q test.txt
1
2
3
4
5

 

 

 

6.sed高级用法

sed除了模式空间(模式空间相当于sed里面一个缓冲区,这个缓冲区每处理一个文件的行,他都会把这一行读入到模式空间中,在这个模式空间中来执行相关指令),在sed高级用法中,我们增加了一个新的空间,叫Holdspace保持空间,也就是说,sed里有两个空间了,这个Hold Space相等于增加了一个新的空间,这个新的空间可以带来什么好处?

就是让我们处理文件的时候,有一个临时存放中间数据的空间,而我们原来只有一个模式空间,这个模式空间它处理不完,那么也会被新的读入的行覆盖,所以我们现在多增加一个Hold Space。

 

 

7.下图便于我理解

 

 

 

8.sed高级用法:P

打印模式空间开端到\n(换行)内容,并且追加到默认输出之前,也就意味着,在模式空间可以换多行,以前我们认为只能换一行,实际上,它是可以换多行的,为什么允许换多行?

因为有了Hold Space了,Hold Space里面将来处理完以后,这里面行不一定是一行,可以有多行,既然有多行,那么P把其中的第一行打印出来,后面就不打了,p有啥打啥。

 

 

9.sed高级用法:h

把模式空间中的内容覆盖至保存空间中

 

 

10.sed高级用法:H

把模式空间中的内容追加至保持空间中

 

 

 

11.sed高级用法:g

把保持空间取出数据覆盖至模式空间,和h相反

 

 

 

12.sed高级用法:G

从保持空间取出数据追加至模式空间,和H相反

 

 

13.sed高级用法:x

把模式空间的内容和保持空间的内容进行互换

 

 

14.sed高级用法:n

读取匹配的行的下一行覆盖到模式空间

什么叫下一行,比如说我们现在读了第一行进来,见到n,他就把第二行也读了进来并覆盖了第一行

 

 

15.sed高级用法:N

读取匹配到的行的下一行追加至模式空间

 

 

16.sed高级用法:d

删除模式空间中的全部行

 

 

17.sed高级用法:D

如果模式空间也含换行符,则删除直到第一个换行符的模式空间的文本(说白了,就是删除第一行)

 

 

18.范例一:

[root@centos8 ~ 689]#seq 10 | sed -n 'n;p'
2
4
6
8
10

用sed高级用法打印文本偶数行

所以我们结合之前学的就有4种取偶数行的用法

seq 10 | sed -n '2~2p'
seq 10 | sed -n '1~2!p'
seq 10 | sed  '1~2d'
seq 10 | sed -n 'n;p'

 

 

 

19.范例二:

[root@centos8 ~ 693]#seq 10 | sed 'N;s/\n//'
12
34
56
78
910

这个就是把奇数偶数显示成一行

 

 

20.范例三:

[root@centos8 ~ 694]#seq 10 | sed '1!G;h;$!d'
10
9
8
7
6
5
4
3
2
1

逐步分析:

1!G:不是第一行执行G

h:执行h

$!d:不是结尾执行d

所以合起来就是将文本的行倒了过来。

当然还有一种方法

[root@centos8 ~ 695]#seq 10 | tac
10
9
8
7
6
5
4
3
2
1

 

 

2022-2-4  18:33

posted on 2022-02-04 18:35  魏蓝  阅读(265)  评论(0编辑  收藏  举报