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

Linux笔记12——shell编程基础-6

字符截取命令

一、cut命令

功能:用于从文件或标准输入中提取指定字段或列

语法:cut [选项] 文件名

  • -f:列号,提取第几列,默认识别制表符分割出来的列(列号之间用,隔开)
  • -d:分隔符,按照指定的分隔符进行分割,然后结合-f提取指定列
  • -c:字符范围,不依赖分隔符,通过字符范围进行提取(n-m:从第n个提取到第m个字符;n-:从第n个字符开始提取到结尾;-m:从第1个字符提取到第m个字符)
1.准备测试数据
[root@localhost ~]# cat cut.txt 
ID	NAME	LINUX	MYSQL	DOCKER
0	xzhao	95	59	78
1	xqian	83	75	93
2	xsun	74	96	632.用-f选项过滤指定列的内容
[root@localhost ~]# cut -f 2,5 cut.txt
NAME	DOCKER
xzhao	78
xqian	93
xsun	63
#cut只能分割用制表符分开列的文件,若列是用其他符号分割的,需要用-d选项指定3.通过-d指定分隔符的方式过滤指定文件的第7列
[root@localhost ~]# cut -d: -f 7 /etc/passwd
/bin/bash
/sbin/nologin4.获取当前所在路径的最后一个层级目录
[root@localhost ~]# pwd 
/root
[root@localhost ~]# pwd | cut -d/ -f 2
root#-c 可以按照字符数量进行截取,按照对应格式可以取到对应位置的字符
#截取多个范围的字符时用,隔开
5.用-c选项截取指定范围的列
[root@localhost ~]# head -n 5 anaconda-ks.cfg 
# Generated by Anaconda 34.25.4.9
# Generated by pykickstart v3.32
#version=RHEL9
# Use graphical install
graphical
[root@localhost ~]# head -n 5 anaconda-ks.cfg | cut -c 1-5
# Gen
# Gen
#vers
# Use
graph

二、awk命令

功能:对文件进行行提取和列提取

格式:awk ‘条件{动作}’ 文件名

  1. 条件的作用:通过指定条件过滤出符合条件的行,没有指定则是操作所有行
  2. 动作的作用:通过动作将符合条件的行打印出来,打印时可选择打印该行中的哪些列

注:条件控制行,动作控制列

例:awk  '{print 列}'  文件名  或  awk  '{printf 列}'  文件名——(不换行)

  • awk的内置参数$n:n=0表示所有列,n=1表示第一列......
  • 从printf打印输出可以看出,awk的工作原理是一行一行去处理的
  • NF:这行的列数(固定);$NF可以去每列的最后一行;$(NF-1)可以取倒数第二列
  • FS:用来声明awk的分隔符,如BEGIN{FS=":"};或-F指定分隔符
  • NR:当前行(变化),即awk 'NR==2{print $2"\t"$4}' 文件名
#不指定任何条件,直接执行动作,并选择输出哪些列,常用printf来打印
1.等价cut,截取第2列和第5列的值
[root@localhost ~]# awk '{print $2"\t"$5}' cut.txt 
NAME	DOCKER
xzhao	78
xqian	93
xsun	632.读取文件中任意一列的数据
[root@localhost ~]# awk '{printf $1"\t" $2"\t" $3"\n"}' cut.txt
ID	NAME	LINUX
0	xzhao	95
1	xqian	83
2	xsun	74
[root@localhost ~]# awk '{printf $0 "\n"}' cut.txt
ID	NAME	LINUX	MYSQL	DOCKER
0	xzhao	95	59	78
1	xqian	83	75	93
2	xsun	74	96	63#NF
3.读取文件每行的总列数
[root@localhost ~]# awk '{print NF}' cut.txt
5
5
5
5
4.获取文件的最后一列
[root@localhost ~]# awk '{print $NF}' cut.txt
DOCKER
78
93
63
5.获取文件的倒数第二列
[root@localhost ~]# awk '{print $(NF-1)}' cut.txt
MYSQL
59
75
96
6.获取文件的第一列和最后一列
[root@localhost ~]# awk '{print $1"\t"$NF}' cut.txt
ID	DOCKER
0	78
1	93
2	63#FS或-F,FS条件直接使用没有办法正常匹配第一行,需要用到BEGIN;默认分隔符是空白
7.读取/etc/passwd的第一列和最后一列
[root@localhost ~]# awk '{FS=":"}{print $1 "\t" $NF}' /etc/passwd
root:x:0:0:root:/root:/bin/bash	root:x:0:0:root:/root:/bin/bash
bin	/sbin/nologin
daemon	/sbin/nologin
adm	/sbin/nologin
lp	/sbin/nologin
sync	/bin/sync
.....................
[root@localhost ~]# awk -F: '{print $1 "\t" $NF}' /etc/passwd
root	/bin/bash
bin	/sbin/nologin
daemon	/sbin/nologin
adm	/sbin/nologin
.....................
[root@localhost ~]# awk 'BEGIN{FS=":"}{print $1 "\t" $NF}' /etc/passwd
root	/bin/bash
bin	/sbin/nologin
daemon	/sbin/nologin
adm	/sbin/nologin
lp	/sbin/nologin#NR条件
8.截取磁盘的使用率
[root@localhost ~]# df -h | awk '{print $5}'
已用%
0%
0%
2%
12%
13%
0%
9.截取磁盘的使用率的数据部分
[root@localhost ~]# df -h | awk 'NR>1{print $5}'
0%
0%
2%
12%
13%
0%
10.截取根分区的磁盘使用率
[root@localhost ~]# df -h | awk 'NR==5{print $5}'
12%
11.截取根分区磁盘使用率的数字部分
[root@localhost ~]# df -h | awk 'NR==5{print $5}' | cut -d% -f1
12

三、awk的条件

1.自定义条件

  • 关系运算条件(>,<,>=,<=,==,!=):用来判断左右两侧的关系
  • 包含匹配条件(~,!~,~//,!~//):用来进行匹配包含关系的,支持正则
1.列出所有行号大于1的行的列数据
[root@localhost ~]# awk 'NR>1{print $0}' cut.txt 
0	xzhao	95	59	78
1	xqian	83	75	93
2	xsun	74	96	632.列出学号为2的各科成绩单
[root@localhost ~]# awk '$1==2{print $0}' cut.txt 
2	xsun	74	96	633.列出LINUX成绩大于等于80的成绩单
[root@localhost ~]# awk '$3>=80{print $2"\t"$3}' cut.txt 
NAME	LINUX
xzhao	95
xqian	834.获取当前用户使用的网卡名
[root@localhost ~]# ip add | grep "inet[^6]" | grep -v "127" | awk '{print $NF}'
ens1605.列出第二列包含字符q的数据
[root@localhost ~]# awk '$2~"q"{print $0}' cut.txt 
1	xqian	83	75	936.列出第二列以字符n结尾的数据
[root@localhost ~]# awk '$2~"n$"{print $0}' cut.txt 
1	xqian	83	75	93
2	xsun	74	96	637.列出包含数字3的数据
[root@localhost ~]# awk '$0~"3"{print $0}' cut.txt 
1	xqian	83	75	93
2	xsun	74	96	63
或
[root@localhost ~]# awk '$0~/3/{print $0}' cut.txt 
或
[root@localhost ~]# awk '/3/{print $0}' cut.txt 8.列出以.com结尾的数据
[root@localhost ~]# awk '/\.com$/{print $0}' cut.txt 

2.预定义条件

  • BEGIN:在awk未读取数据前声明的条件
  • END:在awk处理完所有数据后声明的条件
[root@localhost ~]# awk 'BEGIN{printf "MYSQL成绩单:\n"} {printf $2"\t"$4"\n"}' cut.txt
MYSQL成绩单:
NAME	MYSQL
xzhao	59
xqian	75
xsun	96[root@localhost ~]# awk '{printf $2"\t"$5"\n"}END{printf "以上显示的是所有人的DOCKER成绩\n"}' cut.txt
NAME	DOCKER
xzhao	78
xqian	93
xsun	63
以上显示的是所有人的DOCKER成绩

  1. 若有多个条件(动作),可以用空格分隔
  2. 在包含匹配中,若想使用特殊字符的转义态,需要使用~//符号,不能直接用“”
  3. 可以用“”的地方一定可以用//,但可以用//的地方不一定可以用“”
  4. awk在使用的时候可能会存在一些格式上的问题
  5. awk {print $3+$4},还可以做运算

四、动作(printf)

功能:printf是标准的格式化输出,取消所有默认格式,然后手动指定输出内容的类型和输出时的格式

格式:printf  '类型/格式'  字符串

输出类型

  • %s:将内容按照字符串类型输出(如:ns代表输出宽度是n,默认右对齐,-ns是左对齐)
  • %i:将内容按照整数类型输出(如:ni代表输出的宽度是n,默认右对齐,-ns是左对齐)
  • %f:将内容按浮点数类型输出(如%.2f,保留两位小数,四舍五入)

输出格式

  • \t:字符之间用制表符分割,即tab键
  • \n:字符之间用换行符分割,即enter键
  • 注:输出格式需要加双引号
1.使用printf输出表格文件
[root@localhost ~]# printf %s $(cat cut.txt)
IDNAMELINUXMYSQLDOCKER0xzhao9559781xqian8375932xsun749663[root@localhost ~]# 
#在使用printf输出时,如果仅指定输出类型,而不指定输出格式,则会把所有要输出内容连在一起输出,变
为一整行[root@localhost ~]# printf '%s\t%s\t%s\t%s\t%s\n' $(cat cut.txt)
ID	NAME	LINUX	MYSQL	DOCKER
0	xzhao	95	59	78
1	xqian	83	75	93
2	xsun	74	96	632.在输出时,想让第1列使用整数类型输出,3,4,5列使用浮点类型输出
[root@localhost ~]# printf '%i\t%s\t%.2f\t%.2f\t%.2f\n' $(cat cut.txt|grep -v ID)
0	xzhao	95.00	59.00	78.00
1	xqian	83.00	75.00	93.00
2	xsun	74.00	96.00	63.003.打印名字和Linux成绩,且成绩保留2位小数
[root@localhost ~]# printf '%s\t%.2f\n' $(awk 'NR>1{printf $2"\t"$3"\n"}' cut.txt)
xzhao	95.00
xqian	83.00
xsun	74.004.计算每个人的平均值
[root@localhost ~]# awk 'NR>1{printf $2"的平均分是\t"($3+$4+$5)/3"\n"}' cut.txt
xzhao的平均分是	77.3333
xqian的平均分是	83.6667
xsun的平均分是	77.6667
#awk中默认支持数值运算,并且整数、浮点数运算都支持

字符截取命令练习

问题1:监控当前根分区的使用情况(若根分区使用率超过10%,打印红色超标)

[root@localhost ~]# cat jiance.sh 
#!/bin/bash
usage=$(df -h | awk '$NF~/\/$/{print $(NF-1)}' | cut -d% -f1)
[ $usage -gt 10 ] && echo -e "\e[31m 超标 \e[0m"
[root@localhost ~]# bash jiance.sh 超标 
[root@localhost ~]#

问题2:列出第二列包含x的行的第2列和第4列(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
[root@localhost ~]# awk '$2~"x"{print $2"\t"$4}' cut.txt 
xzhao	59
xqian	75
xsun	96
或
[root@localhost ~]# awk '$2~/x/{print $2"\t"$4}' cut.txt 

问题3:提取IP地址的网段(ip add)

[root@localhost ~]# ip add | grep "inet[^6]"inet 127.0.0.1/8 scope host loinet 192.168.66.66/24 brd 192.168.66.255 scope global noprefixroute ens160
[root@localhost ~]# ip add | grep "inet[^6]" | grep -v "127"inet 192.168.66.66/24 brd 192.168.66.255 scope global noprefixroute ens160
[root@localhost ~]# ip add | grep "inet[^6]" | grep -v "127" | awk '{print $2}'
192.168.66.66/24
[root@localhost ~]# ip add | grep "inet[^6]" | grep -v "127" | awk '{print $2}' | cut -d. -f3
66
[root@localhost ~]#

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

相关文章:

  • 少样本图异常检测系列【A Survey of Few-Shot Graph Anomaly Detection】
  • Python实战:银行ATM系统开发全解析
  • RuoYi-VuePlus:前端指定接口不显示错误提示
  • 面试tips--JVM(2)--对象创建的过程
  • ERNIE-4.5-VL:技术解密+应用实战,解锁多模态新场景!
  • 8.29 贪心|摩尔投票
  • 【不说废话】pytorch中.to(device)函数详解
  • 基于K8s部署服务:dev、uat、prod环境的核心差异解析
  • 工业级TF卡NAND+北京君正+Rk瑞芯微的应用
  • openEuler Embedded 的 Yocto入门 : 5.基本变量与基本任务详解
  • Linux 系统 poll 与 epoll 机制1:实现原理与应用实践
  • DINOv2 vs DINOv3 vs CLIP:自监督视觉模型的演进与可视化对比
  • 传统set+new写法与Builder写法的区别
  • LightRAG
  • 客户案例 | 柳钢集团×甄知科技,燕千云ITSM打造智能服务新生态
  • 第1.9节:神经网络与深度学习基础
  • 基于matplotlib库的python可视化:以北京市各区降雨量为例
  • “今年业务是去年5倍以上”,工业智能体掀热潮
  • 拉普拉斯变换求解线性常系数微分方程
  • 数字接龙(dfs)(蓝桥杯)
  • npm install 安装离线包的方法
  • 【论文阅读】健全个体无辅助运动期间可穿戴传感器双侧下肢神经机械信号的基准数据集
  • 如何打造品牌信任护城河?
  • Spark入门:从零到能跑的实战教程
  • 腾讯云重保流程详解:从预案到复盘的全周期安全防护
  • ♻️旧衣回收小程序|线上模式新升级
  • 网页爬虫的实现
  • 苹果ImageIO零日漏洞分析:攻击背景与iOS零点击漏洞历史对比
  • 2025 深度洞察!晶圆背面保护膜市场全景调研与投资机遇解析
  • 推荐一款JTools插件Crypto