Linux笔记13——shell编程基础-7
补充
1.printf '%s\t%s' 字符串 中,\t一定不要加双引号,这一点和在awk中使用的时候有所不同
2.其中%s也可以写成%ns,n可以被用来设置列宽,默认右对齐
#打印输出文件系统的使用情况
[root@localhost ~]# printf '%-30s\t%s\n' $(df -h | awk '{print $1"\t"$(NF-1)}')
文件系统 已用%
devtmpfs 0%
tmpfs 0%
tmpfs 3%
/dev/nvme0n1p3 11%
/dev/nvme0n1p1 13%
tmpfs 0%
或
[root@localhost ~]# df -h | awk '{printf "%-20s\t%s\n",$1,$(NF-1)}'
文件系统 已用%
devtmpfs 0%
tmpfs 0%
tmpfs 3%
/dev/nvme0n1p3 11%
/dev/nvme0n1p1 13%
tmpfs 0%
3.若想要在包含匹配中调用变量,则需要使用单引号
[root@localhost ~]# awk '$2~/[un]/{print $0}' cut.txt
1 xqian 83 75 93
2 xsun 74 96 63
[root@localhost ~]# name=un[root@localhost ~]# awk '$2~/['$name']/{print $0}' cut.txt
1 xqian 83 75 93
2 xsun 74 96 63#若使用双引号则没有任何用处
[root@localhost ~]# awk '$2~/["$name"]/{print $0}' cut.txt
0 xzhao 95 59 78
1 xqian 83 75 93
2 xsun 74 96 63
4.若内存使用率超过15%,则打印红色的内存超标,当前使用率是多少
[root@localhost ~]# free -htotal used free shared buff/cache available
Mem: 1.9Gi 419Mi 1.2Gi 7.0Mi 455Mi 1.5Gi
Swap: 2.0Gi 0B 2.0Gi
[root@localhost ~]# cat jiance.sh
#!/bin/bash
mem=$(printf '%.f\n' $(free | awk '/Mem/{print $3/$2*100}'))
[ $mem -gt 15 ] && echo -e "\e[31m内存超标,当前使用率是$mem%\e[0m"
[root@localhost ~]# bash jiance.sh
内存超标,当前使用率是22%
[root@localhost ~]#
5.取总的cpu使用率
[root@localhost ~]# top -n 1 | awk '/%Cpu/{printf "%.f\n",$2+$4}'
3
sed命令
功能:实现非交互式对文件进行选取、替换、删除、新增等操作的命令,即不进入文本对其内容进行修改;主要包括读取、执行和显示三个过程
格式:sed [选项] '动作' 文件名
选项
- -n:将经过处理后的数据输出到控制台上;不加-n输入全文+指定行
- -i:直接修改文件内容;默认下sed不会对文件直接修改,而是在内存中修改并将结果显示在控制台
动作
- p:打印,输出指定行
- a:追加,在当前行后追加一行或多行
- i:插入,在当前行前插入一行或多行
- d:删除,删除指定的一行或多行
- c:整行替换,用c后面的字符串替换元数据指定行的数据
- s:字符替换,用一个字符串替换另外一个字符串,格式“行范围s/旧字符/新字符/g”
数据准备
[root@localhost ~]# cat cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xqian 83 75 93
2 xsun 74 96 63
查看
1.显示cut.txt中第三行的信息
[root@localhost ~]# sed '3p' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xqian 83 75 93
1 xqian 83 75 93
2 xsun 74 96 63[root@localhost ~]# sed -n '3p' cut.txt
1 xqian 83 75 932.显示第二行到第四行的信息,查看连续的多行
[root@localhost ~]# sed -n '2,4p' cut.txt
0 xzhao 95 59 78
1 xqian 83 75 93
2 xsun 74 96 633.显示第二行和第四行的信息,查看不连续的多行
[root@localhost ~]# sed -n '2p;4p' cut.txt
0 xzhao 95 59 78
2 xsun 74 96 634.查看符合条件的行,支持正则,扩展正则要使用转义符
[root@localhost ~]# sed -n '/a/p' cut.txt
0 xzhao 95 59 78
1 xqian 83 75 93[root@localhost ~]# sed -n '/[23]\?/p' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xqian 83 75 93
2 xsun 74 96 63
[root@localhost ~]# sed -n '/[23]/p' cut.txt
1 xqian 83 75 93
2 xsun 74 96 63
追加
1.追加,不加-i不改变元数据
#在指定行后面追加
[root@localhost ~]# sed '3a 12\txli\t80\t90\t100\t' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xqian 83 75 93
12 xli 80 90 100
2 xsun 74 96 63
#在指定行前面追加
[root@localhost ~]# sed '3i 12\txli\t80\t90\t100\t' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
12 xli 80 90 100
1 xqian 83 75 93
2 xsun 74 96 632.改变元数据
[root@localhost ~]# sed -i '3i 12\txli\t80\t90\t100\t' cut.txt
[root@localhost ~]# cat cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
12 xli 80 90 100
1 xqian 83 75 93
2 xsun 74 96 633.-a和-i可以在指定位置追加多行
[root@localhost ~]# sed '3a 100 zhangsan \n200 lisi' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xqian 83 75 93
100 zhangsan
200 lisi
2 xsun 74 96 63
删除
1.删除第三行的数据
[root@localhost ~]# sed '3d' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xqian 83 75 93
2 xsun 74 96 632.删除第二行到第四行的数据,删除多行数据
[root@localhost ~]# sed '2,4d' cut.txt
ID NAME LINUX MYSQL DOCKER
2 xsun 74 96 633.删除第二行和第四行的数据
[root@localhost ~]# sed '2d;4d' cut.txt
ID NAME LINUX MYSQL DOCKER
12 xli 80 90 100
2 xsun 74 96 634.删除第三行的元数据,加上-i选项才能更改元数据
[root@localhost ~]# sed -i '3d' cut.txt
[root@localhost ~]# cat cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xqian 83 75 93
2 xsun 74 96 63
替换
1.将第三行内容整行替换
[root@localhost ~]# sed '3c No such person' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
No such person
2 xsun 74 96 632.将第三行中的x替换成xiao
[root@localhost ~]# sed '3s/x/xiao/g' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
1 xiaoqian 83 75 93
2 xsun 74 96 633.将所有行中的x替换成xiao
[root@localhost ~]# sed 's/x/xiao/g' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xiaozhao 95 59 78
1 xiaoqian 83 75 93
2 xiaosun 74 96 634.将指定的一行内容替换成空
[root@localhost ~]# sed '3s/[0-9]//g' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78xqian
2 xsun 74 96 635.同时替换多行,用;隔开
[root@localhost ~]# sed '3s/^/#/g;4s/[0-9]//g' cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
#1 xqian 83 75 93xsun 6.加上-i选项更改元数据
[root@localhost ~]# sed -i '3s/^/#/g;4s/[0-9]//g' cut.txt
[root@localhost ~]# cat cut.txt
ID NAME LINUX MYSQL DOCKER
0 xzhao 95 59 78
#1 xqian 83 75 93xsun
sed命令练习
问题1:关闭selinux
想要关掉selinux,用sed命令修改配置文件
[root@localhost ~]# sed '22s/disabled/enforcing/' /etc/selinux/config
问题2:校验整数
接收客户端输入,若是纯整数则打印是整数,否则打印格式不正确
[root@localhost ~]# cat num.sh
#!/bin/bash
read -p "please enter a num:" num
jq=$(echo $num | sed 's/[0-9]//g')
[ -z "$jq" ] && echo 是整数 || echo 格式不正确[root@localhost ~]# bash num.sh
please enter a num:123
是整数[root@localhost ~]# bash num.sh
please enter a num:12d
格式不正确
问题3:修改网卡配置
用sed命令修改网卡配置文件,进行IP地址获取方式的切换
1.读取当前使用的网卡名
[root@localhost ~]# ip add | grep "inet[^6]" | grep -v "127" | awk '{print $NF}'
ens160
2.将较长的配置文件名赋予变量
[root@localhost ~]# interface=`ip add | grep "inet[^6]" | grep -v "127" | awk '{print $NF}'`
[root@localhost ~]# cf="/etc/NetworkManager/system-connections/$interface.nmconnection"
3.查看当前网卡配置,并显示行号
[root@localhost ~]# cat -n $cf1 [connection]2 id=ens1603 uuid=4c163b33-6eca-3917-b856-9bff2df0e9474 type=ethernet5 autoconnect-priority=-9996 interface-name=ens1607 timestamp=17555496048 9 [ethernet]10 11 [ipv4]12 method=manual13 address=192.168.66.66/24,192.168.66.214 dns=202.106.0.2015 16 [ipv6]17 addr-gen-mode=eui6418 method=auto19 20 [proxy]
4.将ip地址改为手动获取(真实实验中需要加-i选项)
[root@localhost ~]# sed '12s/auto/manual/' $cf
5.手动添加ip地址、掩码、网关和dns(真实实验中需要加-i选项)
[root@localhost ~]# sed '12a address=192.168.66.66/24,192.168.66.2\ndns=202.106.0.20' $cf