Linux三剑客awk/磁盘分区

image

磁盘分区

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

磁盘分区步骤
查看本机的磁盘:lsblk
查看本机的分区:df -h

1、关机
2、添加硬盘
3、创建分区
    fdisk /dev/sdb
	fdisk:分区2TB以下的磁盘,最多可以分4个分区
    gdisk /dev/sdb
	gdisk:分区2TB以上的磁盘,最多可以分128个分区
	磁盘分区:
		n 新建一个分区
		p 打印分区表
		w 写入磁盘并且退出
		q 退出
		d 删除一个分区
4、格式化文件系统
    mkfs.xfs /dev/sdb1 
5、挂载
    mount /dev/sdb1 /mnt

awk

一、定义

awk主要擅长处理有规律的文本,主要用于做一些格式话文本,将文本按照指定的格式输出

二、格式

awk [参数] [处理规则] [操作对象]

三、参数

-F : 指定文本分隔符(默认是以空格作为分隔符)
案例:打印系统所有用户的解析器
      awk -F: '{print $NF}' /etc/passwd

四、awk生命周期

1、awk会接收一行作为输入,并将这一行赋给awk的内部变量$0,每一行也可称为一个记录,行的边界是以换行符作为结束
2、然后,刚刚读入的行被以:为分隔符分解成若干字段(或域),每个字段存储在已编号的变量中,编号从$1开始,最多达100个字段
⚠️如果未指定行分隔符,awk将使用内置变量FS的值作为默认的行分隔符,FS默认值为空格,如果说要指定分隔符,需要使用-F参数或者重新定义FS变量
3、使用print函数打印,如果$1$3之间没有逗号,它俩在输出时将贴在一起,应该在$1,$3之间加逗号,该逗号与awk的内置变量OFS保持一致,OFS默认为空格,于是以空格为分隔符输出$1和$3
我们可以指定:awk -F: 'BEGIN{OFS="-"}{print $1,$3}' /etc/passwd     
4、输出之后,将从文件中获取另一行,然后覆盖给$0,继续(2)的步骤将该行内容分隔成字段。。。继续(3)的步骤,该过程一直持续到所有行处理完毕
5、当awk读完所有的输入行之后,如果存在END{},就执行相应的动作

简洁版

1、awk会读取文件的一行内容然后赋值给$0
2、然后awk会以-F指定的分隔符将该行切分成n段,最多可以达到100段,第一段给$1,第二段给$2,依次次类推
3、print输出该行的第一段和第三段,逗号代表输出分隔符,默认与-F保持一致
4、重复步骤1,2,3直到文件内容读完
5、当awk读完所有的输入行之后,如果存在END{},就执行相应的动作

五、awk处理规则的执行流程

BEGIN{} --> 是在awk处理文本之前运行     
// -->使用正则
	$1 ~ /正则/ -->第一段内容匹配成功正则
	$1 !~ /正则/ -->第一段内容没有匹配成功正则
{} -->循环(每次只处理一行数据)
END{} -->当所有的处理全部执行完毕之后,执行END{}中的相关操作

六、awk中的预定义变量

$0 # 表示当前行
[root@judyju ~]# awk -F: '{print $0}' /etc/passwd 
	每次都打印当前行,这行命令就是打印文本的每一行内容
$n # 表示第几列
[root@judyju ~]# awk -F: '{print $1}' /etc/passwd 
	打印第1列
NF # 表示当前行的字段数
[root@judyju ~]# awk -F: '{print NF}' /etc/passwd
NR # 用来记录行号
[root@judyju ~]# awk -F: '{print NR,$0}' /etc/passwd 
	该行命令表示打印文本全部内容并且将行号标注出
FS # 指定文本内容的分隔符(默认是空格)
[root@judyju ~]# awk 'BEGIN{FS="/"}{print $1}' /etc/passwd
OFS # 指定输出文本的分隔符(默认是空格)
[root@judyju ~]# awk -F: 'BEGIN{OFS="+++"}{print $1,$2}' /etc/passwd
	⚠️$1$2中间必须加逗号,这个逗号默认和OFS定义的变量一致的

七、awk中的函数

print # 打印 
printf # 格式化打印
%s # 字符串
%d # 数字
- # 左对齐
+ # 右对齐-->默认右对齐
15 # 占用15个字节
[root@judyju ~]# awk -F: 'BEGIN{OFS="|"}{printf "%-15s|%-15s\n", $1,$2}' /etc/passwd
⚠️ 值得注意的是:printf后面需要格式化输出的部需要引号引起来

八、awk中的定位

1、正则表达式
/正则规则/
[root@judyju ~]# awk -F: '/'judy'/{print $0}' /etc/passwd
2、比较表达式
	> 大于
	< 小于
	>= 大于等于
	<= 小于等于
	~ 正则匹配
	!~ 正则匹配(取反)
	== 等于
3、逻辑表达式
	&& 与
	|| 或
	! 非
4、算数表达式
	+ 加
	- 减
	* 乘
	/ 除
	% 取余
5、条件表达式
	== / > / < / >= / <=
6、范围表达式
比如第几行到第几行等等

案例

1、打印第三行的第一列和第三列
[root@judyju ~]# awk -F: 'NR=3 {print $1,$3}' /etc/passwd
2、打印第三行到第五行的第一列和第三列
[root@judyju ~]# awk -F: 'NR>=3 && NR<=5 {print $1,$3}' /etc/passwd
3、打印前三行或者大于第八行和第三列
[root@judyju ~]# awk -F: 'NR<=3 || NR>8 {print $3}' /etc/passwd
4、打印所有的nologin结尾的第一列
[root@judyju ~]# awk -F: '/'nologin$'/ {print $1}' /etc/passwd
5、打印/etc/passwd最后一列
[root@judyju ~]# awk -F: '{print $NF}' /etc/passwd
6、把/etc/passwd中的包含root的行打印出来
[root@judyju ~]# awk -F: '/root/ {print $0}' /etc/passwd
7、把/etc/passwd中的以root开头的行打印出来
[root@judyju ~]# awk -F: '/^root/ {print $0}' /etc/passwd
8、打印出root或者ntp开头的行的解析器
[root@judyju ~]# awk -F: '/^root|^ntp/ {print $NF}' /etc/passwd
9、输出/etc/passwd中的所有内容包括行号
[root@judyju ~]# awk -F: '{print NR,$0}' /etc/passwd
10、要求把第7行之后的内容输出,包括行号
[root@judyju ~]# awk -F: 'NR>7 {print NR,$0}' /etc/passwd
11、由案例10,要求输出每行的uid增加1 
[root@judyju ~]# awk -F: 'NR>7 {print $3,$3+1}' /etc/passwd
12、要求输出倒数第三列
[root@judyju ~]# awk -F: '{print $(NF-2)}' /etc/passwd
13、要求不使用-F参数,以:分割,并输出第3列和第5列
[root@judyju ~]# awk 'BEGIN{FS=":"} {print $3,$5}' /etc/passwd
14、在案例13的情况上,要求输出内容以+链接
[root@judyju ~]# awk -F: 'BEGIN{OFS="+"} {print $3,$5}' /etc/passwd
15、要求输出第一列和最后一列,排版整齐
[root@judyju ~]# awk -F: '{printf "%-15s|%-15s\n",$1,$NF}' /etc/passwd
16、打印奇数行
[root@judyju ~]# awk -F: '{if(NR%2==1){print NR,$0}}' /etc/passwd
[root@judyju ~]# awk -F: 'NR%2==1 {print NR,$0}' /etc/passwd
17、要求打印出偶数行中包含bash的行
[root@judyju ~]# awk -F: '/bash/ && NR%2==0 { print $0}' /etc/passwd
[root@judyju ~]# awk -F: '/bash/{if(NR%2==0) { print $0}}' /etc/passwd
18、要求在奇数行前输出奇数,在偶数行前输出偶数
[root@judyju ~]# awk -F: '{if(NR%2==1){printf "奇数行:%s\n",$0}else{printf"偶数行:%s\n",$0}}' /etc/passwd
19、在前7行前加7,在前14行前加14
[root@judyju ~]# awk -F: '{if(NR<=7){printf "7%s\n",$0}else if(NR<=14){printf "14%s\n",$0}else{print $0}}' /etc/passwd

九、流程控制

流程控制只存在于循环中

1、if判断
单分支 if(){}
双分支 if(){}else{}
多分支if(){}else if(){} else{}
-->例题都在上面的案例中

2、for循环
for (变量 in 数组){语句}
for (变量;条件;表达式){语句}
---> for(i="初始值";条件判断;游标){}

[root@judyju ~]# awk -F: '{for(i=0;i<=4;i++){print $0}}' /etc/passwd

-->知识储备:++每次加1 --每次减1

3、while循环
while (条件判断){}

案例

1、把/etc/passwd中的每一行打印三遍
[root@judyju ~]# awk -F: '{i=0;while(i<3){print $0,i++}}' /etc/passwd
2、统计/etc/passwd中每个解析器的用户数
3、要求把/etc/passwd中的第10行中每列都打印出来
[root@judyju ~]# awk -F: 'NR==10{i=1;while(i<=NF){print $i;i++}}' /etc/passwd
posted @ 2021-12-22 17:28  JudyJU  阅读(92)  评论(0)    收藏  举报