当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/357116.html

相关文章:

  • More Effective C++ 条款16:牢记80-20准则(Remember the 80-20 Rule)
  • Java泛型使用常见报错
  • Stream API 讲解
  • 上传文件到本地
  • LeetCode Hot 100 第8天
  • 医疗 AI 的 “破圈” 时刻:辅助诊断、药物研发、慢病管理,哪些场景已落地见效?
  • 174. Java 注释 - 声明注释类型
  • 《AI智脉速递》2025 年 8 月22 日 - 29 日
  • VS2022+QT6.7+NetWork(TCP服务器多客户端助手)
  • Rust 登堂 之 深入Rust 类型(六)
  • 如何打造团队协作型 IP,而非单人依赖型?
  • BugKu Web渗透之file_get_contents
  • Kotlin中回调函数的使用示例
  • Git-Git和TortoiseGit的安装以及使用
  • 云渲染云推流助力WebGL应用网页端无负担推流,摆脱终端加载缓慢问题
  • 无恶意软件勒索:Storm-0501如何转向云原生攻击
  • Linux829 shell:expect interact “ “ set
  • 知识卡片html5动态网页源码
  • CRYPT32!CryptMsgUpdate函数分析之CRYPT32!PkiAsn1Decode函数的作用是得到pci
  • ros2--topic/话题--接口
  • tauri打包失败
  • 太阳光模拟器在卫星研发与测试中的应用
  • wav音频转C语言样点数组
  • 嵌入式Linux设备树驱动开发 - dtsof驱动
  • shell学习(二)
  • Sharding-JDBC 使用方法
  • 为什么不能创建泛型数组?
  • C++并发编程-17. 线程安全的链表
  • Unity EventTrigger 动态添加事件
  • flume事务机制详解:保障数据可靠性的核心逻辑