Linux中磁盘管理与三剑客之awk初识

时间:2024-03-11 09:03:29

昨日内容回顾

1.用两种方法实现 将文件中以 # 开头的行 把 # 去掉
	sed -r 's/^ *#//g' /etc/fstab
	cat /etc/fstab | tr -d '^#'
    
2.将文件中的Hello World 替换成 World Hello
	sed -r 's/Hello World/World Hello/g' 1.txt
	awk '{print $2,$1}' 1.txt
    
3.删除一个文本中所有的数字
	sed 's/[0-9]//g' 1.txt
	cat 1.txt | tr -d [0-9]

今日内容概要

  • 磁盘管理
  • 三剑客之awk初识

磁盘管理

# Linux系统中磁盘管理 就是将硬盘通过挂载的方式 挂载到linux文件系统中

# 挂载步骤
	1.新建磁盘
		01.将虚拟机关机 
		02.选择 编辑虚拟机设置
		03.选择 添加
		04.选择 磁盘 一直下一步
		05.完成
        
	2.执行分区操作
		fdisk :	分区2TB以下的磁盘 最多可以分4个分区
			参数:
				n :	新建一个分区
				p :	打印分区表
				w :	写入磁盘并退出
				q :	退出
				d :	删除一个分区
			01.执行 fdisk /dev/sdb 进入分区操作
			02.按 n 
			03.直接 enter 到 Last 扇区, +扇区 or +size{K,M,G}选项
			04.手动添加 +100G 
			05.按 w 保存退出
			06.格式化文件系统 mkfs.xfs /dev/sdb1 
			07.挂载 mount /dev/sdb1 /mnt
            
		gdisk :	分区2TB以上的磁盘 最多可以分128个分区
			步骤等同于 fdisk
            
# 查看系统磁盘信息
	lsblk :	查看本机的磁盘(包含未挂载的)
	df -h :	查看本机的分区(仅显示已经挂载的)

image

image

image

image

image

image

image

image

image

三剑客之awk

'''
awk主要是用来格式化输出文本
grep、sed和awk都是读一行处理一行 直至处理完成
'''

# 1.语法格式
	awk [参数] [处理规则] [操作对象]
	
	参数:
		-F :	指定文本的分隔符(不指定的话 默认为 空格)
		案例:
			awk -F'f' '{print $2}' 1.txt  # 显示以 f 分隔后的第二列内容
			awk -F '{print $2}' 1.txt  # 显示以 空格 分隔后的第二列内容
            
			打印系统所有用户的解析器
			awk -F: '{print $NF}' /etc/passwd  # 以 :分隔 显示最后一列内容
                
# 2.awk的生命周期
	01. 接收一行内容作为输入
    02. 把刚刚接收到的文本进行分解
    03. 使用处理规则处理文本
    04. 读取一行 赋值给 $0 直至处理完成
    05. 把处理完成之后的所有数据 交给 END{} 来再次处理
    
# 3.awk中的预定义变量
	$0 :	代表当前行
        案例:
            awk -F: '{print $0, "---"}' /etc/passwd  # 输出每行内容 并且每行最后会加上 ---
                
    $n :	代表第n列(0 除外)
        案例:
            awk -F: '{print $1}' /etc/passwd  # 以 :分隔后 输出第一列内容
                
	NF :	记录当前行的字段数
        案例:
            awk -F: '{print NF}' /etc/passwd  # 输出每一行按 :分隔后的列数
                
	NR :	用来记录行号
        案例:
            awk -F: '{print NR}' /etc/passwd  # 将文本内容替换成行号输出
                
	FS :	指定文本的分隔符(不指定的话 默认为 空格)
        案例:
            awk 'BEGIN{FS=":"}{print $NF}' /etc/passwd  # 以:分隔 输出最后一列内容
            等同于 -F 作用 
            但是如果同时用 以 FS 指定的分隔符优先
            
	OFS :	指定打印分隔符(不指定的话 默认为 空格)
        案例:
            同时输出不止一项内容时 默认按空格分隔输出显示
            awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd  # 输出的最后一列内容 和 第一列内容 中间以 >>> 分隔
                
# 4.awk处理规则的执行流程
	BEGIN{} :	定义变量
    // 		:	正则
    {} 		:	循环
    END{}	:	输出之前最后再统一处理一次(如果没有出现 就没有任何效果)
	'''
	在 awk 语法中 至少有一个流程 最多可以同时有四个流程
	执行顺序就是从上往下 一次执行
	'''
        
# 5.awk中的函数
	"""函数只能够写在 循环之中{}"""
	print  :	打印
	printf :	格式化打印
	%s :		字符串占位
	%d :		数字占位
	-  :		左对齐
	+  :		右对齐
	15 :		至少占位15个字符(*定义)
            
		案例:
			awk -F: 'BEGIN{OFS=" | "}{printf "|%s|%s|\n", $NF,$1}' /etc/passwd  
			# 将文件内容以 | 分隔后 输出最后一列和第一列 并且用 | 分隔显示 显示的内容继续按每行显示(\n 换行)
                
			awk -F: 'BEGIN{OFS=" | "}{printf "|%-15s|%-15s|\n", $NF,$1}' /etc/passwd  
			# 将文件内容以 | 分隔后 输出最后一列和第一列 并且用 | 分隔显示 并且显示的每列内容至少要有15位字符 
			# 如果当列内容不够占位数 则用空格顶替
			# 如果当列内容多余指定占位数 则分隔符移至内容末尾 再继续当前行的下一列                
# 6.awk中的定位
	01.正则定位
		awk -F: '/root/{print $0}' /etc/passwd  # 显示文件中含有 root 的所有行
    	
		awk -F: '/^root/{print $0}' /etc/passwd  # 显示文件中以 root 开头的行
            
	02.比较定位(比较文本内的内容)
		>  :	大于
		<  :	小于
		>= :	大于等于
		<= :	小于等于
		~  :	正则匹配(后面跟匹配规则)
		!~ :	正则匹配(后面跟匹配规则 但取反)
        
		案例:
			打印属组ID大于属主ID的行 passwd文件中以 :分隔 第三列是属主 第四列是属组
			awk -F: '$4 > $3{print $0}' /etc/passwd  # 以 :分隔 打印大于号比较之后的结果行
                
			打印结尾包含bash的行
			awk -F: '$NF ~ /bash/{print $0}' /etc/passwd  # 以 :分隔 最后一列进行正则匹配 输出匹配到的行
                
			打印结尾不包含bash的行(取反)
			awk -F: '$NF !~ /bash/{print $0}' /etc/passwd  # 以 :分隔 最后一列进行正则匹配 输出匹配到的行(匹配到的行都是最后一列 不包含bash的)
    
	03.逻辑定位
		&& :	逻辑 与(同时满足前后条件)
		|| :	逻辑 或(满足一个条件即可)
		!  :	逻辑 非(只取不符合条件的)
		案例:
			awk -F: '$3 + $4 > 100 && $3 * $4 > 200{print $0}' /etc/passwd  # 输出 第三列+第四列大于100 且 第三列*第四列大于200 的行
            
			awk -F: '$3 + $4 > 500 || $3 * $4 > 2000{print $0}' /etc/passwd  # 输出 第三列+第四列大于500 或者是 第三列*第四列大于2000 的行
                
			awk -F: '!($3 + $4 > 500){print $0}' /etc/passwd  # 输出 第三列+第四列不大于500的行(符合条件的都隐藏不打印)   
    
	04.算数定位(要保证计算的对象是 纯数字)
		+ :	加
		- :	减
		* :	乘
		/ :	除
		% :	模(取整除后的 余)
		案例:
			awk -F: '$3 + $4 > 1000{print $0}' /etc/passwd  # 打印属主id 加 属组id的和大于1000的行
                
			awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd  # 打印属主id 乘 属组id的和大于2000的行    
                
			awk -F: 'NR % 2 == 0{print $0}' /etc/passwd  # 打印 行号除2的商为整数(余值是0)的行  就是打印偶数行
                
			awk -F: 'NR % 2 == 1{print $0}' /etc/passwd  # 打印 行号除2的商为整数(余值是1)的行  就是打印奇数行
    
	05.条件定位(比较文本内容之外 我们赋予的内容 例如: 行号)
		== :	等于
		>  :	大于
		<  :	小于
		>= :	大于等于
		<= :	小于等于
		案例:
			要求打印第2行内容
			awk -F: 'NR == 2{print $0}' /etc/passwd  # 打印行号为 2 的行
    
	06.范围定位(开头 结尾 之间用逗号隔开)
		awk -F: '/^root/,/^lp/{print $0}' /etc/passwd  # 打印 以root开头行 到以lp开头行(打印整个范围)
    
# 7.流程控制
	'''只能写在循环{}中'''
	if 语法:
		if(){}
		if(){}else{}
		if(){}else if(){}else{}
		案例:
			awk -F: '{if($3>$4){print "大于"}else{print "小于或等于"}}' /etc/passwd  # 输出的行内容为:(如果条件成立)输出大于 (如果条件不成立)输出小于或等于
    
	for 语法:
		for(i="初始值";条件判断;游标){}
		'''
		初始值:循环结束的规则
		条件判断:定义循环的起始条件
		游标:固定执行规则
		'''
        
		案例:
			awk -F: '{for(i=10;i>0;i--){print $0}}' /etc/passwd  # 文本内容每行打印10遍
			'''
			i 等于 10 结束循环 但是本次循环执行
			i 大于 0 定义循环的起始条件
			i++ 每次循环i加1
			'''
			i 等于 0 打印当前行
			i 等于 1 打印当前行
			...
			i 等于 10 打印当前行 并且 for循环结束 
            
			开始读取下一行内容并重新执行 for循环
			i 等于 0 打印当前行
			i 等于 1 打印当前行
			...
			i 等于 10 打印当前行 并且 for循环结束
			...
			一直打印到全部文本内容结束
            
	while 语法:
		while(条件判断){}
        
		案例:
			awk -F: '{i=0; while(i<10){print $0, i++}}' /etc/passwd  # 文本内容每行打印9遍
			'''
			i 等于 0 定义循环的起始条件
			i 等于 10 结束循环 但是本次循环不执行
			i++ 每次循环i加1
			'''
			i 等于 0 打印当前行
			i 等于 1 打印当前行
			...
			i 等于 10 循环结束 当次不执行
            
			开始读取下一行内容并重新执行 while循环
			i 等于 0 打印当前行
			i 等于 1 打印当前行
			...
			i 等于 10 循环结束 当次不执行
			...
			一直打印到全部文本内容结束
            
            
# 练习
	每隔5行,打印一行横线
	awk -F: '{if(NR%5==0){print "----------------"}print $0}' /etc/passwd  # 行号整除5的行(余值为0)之后 打印---- 再继续处理后续内容