• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
武纪亨
博客园    首页    新随笔    联系   管理    订阅  订阅
磁盘挂载与awk

磁盘管理

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

​ 磁盘分区
​ fdisk : 分区2TB以下的磁盘,最多可以分4个分区
​ gdisk : 分区2TB以上的磁盘,最多可以分128个分区

​ 1、增加一块硬盘
​

	查看硬盘命令:lsblk
    查看本机分区:df -h

​ 2、做磁盘分区
​

	1、开始磁盘分区(磁盘分区的命令:fdisk)
	
		[root@www dev]$ fdisk /dev/sdb
		
		Command (m for help): n				选择指令
		Partition type:						分区类型
		   p   primary (0 primary, 0 extended, 4 free)	主分区
				primary      : 已经分过的分区
				extended	 : 已经分过的逻辑分区
				free		 : 总共还可以分多少个分区
		   e   extended									逻辑分区
		Select (default p): 							选择分区类型
		Partition number (1-4, default 1): 				选择分区的编号
		First sector (2048-419430399, default 2048): 	分区开始的桶
		Last sector, +sectors or +size{K,M,G} (2048-419430399, default 419430399): +100G 	分区结束的桶
		Command (m for help): p
		   Device Boot      Start         		End      		Blocks      Id                System
		    /dev/sdb3            2048   		209717247   	104857600   83                Linux
			分区的名称		开始的桶的编号   结束的桶的编号		桶的数量    当前硬盘的编号     文件系统

磁盘分区指令:
		m : 帮助信息
		n : 新增一个分区
		p : 查看分区列表
		w : 写入分区到硬盘
		q : 退出
		d : 删除一个分区

​ 3、格式化文件系统
​

	mkfs.xfs [文件系统分区的路径]
	[root@www dev]$ mkfs.xfs /dev/sdb3 
	meta-data=/dev/sdb3              isize=512    agcount=4, agsize=6553600 blks
			 =                       sectsz=512   attr=2, projid32bit=1
			 =                       crc=1        finobt=0, sparse=0
	data     =                       bsize=4096   blocks=26214400, imaxpct=25
			 =                       sunit=0      swidth=0 blks
	naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
	log      =internal log           bsize=4096   blocks=12800, version=2
			 =                       sectsz=512   sunit=0 blks, lazy-count=1
	realtime =none                   extsz=4096   blocks=0, rtextents=0

``
​ 4、挂载使用
​

	mount [选项(参数,非必须)] [磁盘分区的路径] [挂载的路径]

	    mount /dev/sdb3 /mnt
	
	卸载:
		umount [挂载的路径]
		umount /mnt
		
		注:卸载文件时,光标不能够在卸载的目录
		[root@www mnt]$ umount /mnt     # 挂载完成进行卸载
		umount: /mnt: target is busy.
				(In some cases useful info about processes that use
				 the device is found by lsof(8) or fuser(1))
		[root@www mnt]$ cd
		[root@www ~]$ umount /mnt
		[root@www ~]$ ls /mnt/
		123.txt

​ 5、查看挂载

	/cd/sbd3   #  光驱设备
	[root@www ~]$ mount /dev/sdb3 /mnt/     # 进行挂载
	[root@www ~]$ df -h     # 检查挂载
	Filesystem               Size  Used Avail Use% Mounted on
	devtmpfs                 475M     0  475M   0% /dev
	tmpfs                    487M     0  487M   0% /dev/shm
	tmpfs                    487M  7.5M  479M   2% /run
	tmpfs                    487M     0  487M   0% /sys/fs/cgroup
	/dev/mapper/centos-root   98G  2.2G   96G   3% /
	/dev/sda1                509M  132M  378M  26% /boot
	tmpfs                     98M     0   98M   0% /run/user/0
	/dev/sdb3                100G   33M  100G   1% /mnt

awk

awk 主要是用来处理文件,将文本按照指定的格式输出。(包含变量,循环以及数组)

awk 的格式

awk [选项] '匹配规则和处理规则' [处理文本路径]

    awk -F: '{print $1}' /etc/passwd
    
标准输出 | awk [选项] '匹配规则和处理规则'

    cat /etc/passwd | awk -F: '{print $1}'
匹配规则主要是正则表达式
    1.字符串
    2.正则表达式
处理规则:
    设置变量
    设置数组
    数组循环
    加减乘数运算
    字符串拼接
    
awk包含多少个部分及其作用?
BEGIN{}     : BEGIN是在awk处理文本之前运行
//          : 使用的匹配规则
{}          :循环(每次只处理一行数据)
END{}       : 当所有的处理全部执行完毕之后,执行END中的相关操作
案例
    1. 把 /etc/passwd 中的包含root的行打印出来
        awk -F:'/root/' /etc/passwd
        
    2. 把/etc/passwd 中以root开头的行打印出来
        awk -F:'/^root/' /etc/passwd
        
    3. 将 /etc/passwd 中匹配第三列和第五列的数据
        awk -F:'{print $5,$3}' /etc/passwd
        
    4. 打印以root或者ntp开头行的解析器
        awk -F:'/^root|^ntp/{print $7}' /etc/passwd
        awk -F:'/^(root|ntp)/{print $7}' /etc/passwd
案例
    1.统计/etc/passwd 文件中空行的数量
        grep '^ $'/etc/passwd|wc -l
        grep -c '^ $'/etc/passwd
        
        通过awk表示前面先计算,最后通过END将结果进行显示
        awk '/^ $/{i++}END{print i}' /etc/passwd
        
    
    2.统计 /etc/passwd文件中有多少个虚拟用户
        awk '/nologin$/{i++}END{print i}' /etc/passwd
        
    3.统计文件中的数值的和
        seq 10 |awk '{sum=sum+$0}END{print sum}'
###### awk 的工作原理
    1. awk 会接收一行作为输入,并将这一行赋给awk的内部变量$0,每一行称为一个记录,行的边界是以换行符作为结束(表明:awk 是一行一行的去处理文本)
        awk -F: '{print $0}' /etc/passwd
    
    2. 然后,刚刚读入的行被以:为分隔符分解成若干字段(或域),每个字段存储在已编号的变量中,编号从$1开始,最多达100个字段
    注意:如果未指定行分隔符,awk将使用内置变量FS的值作为默认的行分隔符,FS默认值为空格,如果说要指定分隔符,需要使用-F参数或者重新定义FS变量。
        倒数:awk -F: '{print $NF}' /etc/passwd
        倒数第二列:awk -F: '{print $(NF-1)}' /etc/passwd
    
    3. 使用print函数打印,如果$1$3之前没有逗号,它俩在输出时将贴在一起,应该在$1,$3之间加逗号,该逗号与awk的内置变量OFS保持一致,OFS默认为空格,于是以空格为分隔符输出$1和$3我们可以指定:
        awk -F:'BEGIN{OFS="-"}{print $1,$3}' /etc/passwd
       
        
    4. 输出之后,将从文件中获取另一行,然后覆盖给$0,继续 (2)的步骤将改行内容分隔成字段。   继续(3)的步骤该过程一直持续到所有行处理完毕。

awk 的变量

$0  : 保存当前行的内容
    [root@localhost ~]# awk -F: '{print $0, "---"}' /etc/passwd

$n  : 代表第n列
    [root@localhost ~]# awk -F: '{print $1}' /etc/passwd
    
NR  : 记录号(行号),每处理完一条记录,NR值加1
	[root@localhost ~]# awk -F: '{print NR}' /etc/passwd

NF  : 保存记录的字段数
    [root@localhost ~]# awk -F: '{print NF}' /etc/passwd
	[root@localhost ~]# awk -F: '{print $NF}' /etc/passwd
    
FS  : 输入字段分隔符,默认空格
    [root@localhost ~]# awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd
	FS 的优先级要高于 -F
    
OFS : 输出字段分隔符,默认空格
    [root@localhost ~]# awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd
案例
    1. 输出 /etc/passwd 中的所有内容包括行号。
        awk -F:'{print NR,$0}' /etc/passwd
        
    2. 要求把第7行之后的内容输出出来,包括行号
        awk -F:'NR > 7{print NR,$0}' /etc/passwd
        
    3. 要求输出第7行之后的内容且第14行之前的内容输出出来,包含行号
        awk -F:'NR > 7 && NR < 14{print NR,$0}' /etc/passwd
        
    4. 由案例3,要求输出每行的UID增加1
        awk -F:'NR > 7 && NR < 14{print $3,$3+1}' /etc/passwd
        
    5. 要求输出倒数第三列
        awk -F:'{print $(NF-2)}' /etc/passwd
        
    6. 要求不使用-F参数,以:分割,并输出第三列和第五列
        awk 'BEGIN{FS=":"}{print $5,$3}' /etc/passwd
        
    7. 要求实验证明-F和FS的优先级
        awk -F/ 'BEGIN{FS=":"}{print $7,$3}' /etc/passwd
    注:证明得出-F参数的优先级小于FS变量优先级
    
    8. 要求以:分割,并输出第三列和第五列,第三列和第五列之间使用+号分割
        awk -F:'BEGIN{OFS="+"}{print $3,$5}' /etc/passwd
    注:所有变量的定义都应该放在BEGIN里面

awk的函数

============= print函数 =============
date | awk '{print "月:",$2,"\n年:",$1}'
awk -F: '{print "用户名:",$1,"用户id:",$3}' /etc/passwd
    ============= printf函数 =============
​    awk -F:'{peintf "用户名:%s 用户id:%s\n",$1,$3}' /etc/passwd
​    awk -F:'{printf "|%-15s| %-10s| %-15s|\n",$1,$2,$3}' /etc/passwd


​    
​    %s  : 字符类型
​    %d  : 数值类型
​    15  : 占15格的字符串
​    -   : 表示左对齐,默认是右对齐
​    print  打印
​    printf 格式化打印默认不会在行尾自动换行,加\n
案例
    要求输出第1列和最后一列,排版整齐
        awk -F:'{printf "%-16s %s \n",$1,$NF}' /etc/passwd
        
    最长字符:awk -F: '{print length($1)}' /etc/passwd
    打印最长的字符值:
        awk -F: 'BEGIN{num=0}{if(length($1) > num){num=length($1)}}END{print num}' /etc/passwd

操作模式

1. 正则模式
    awk -F:'/^xxx/' /etc/passwd
    
2. 比较模式 > < >= <= ~ :正则匹配   !~ : 正则匹配(取反)
    awk -F:'NR > 7' /etc/passwd
    
案例:要求打印属组ID大于属主ID的行
		[root@localhost ~]# awk -F: '$4 > $3{print $0}' /etc/passwd
	
	案例:结尾包含bash
		[root@localhost ~]# awk -F: '$NF ~ /bash/{print $0}' /etc/passwd
	
	案例:结尾不包含bash
		[root@localhost ~]# awk -F: '$NF !~ /bash/{print $0}' /etc/passwd    

​
​ 3. 逻辑模式
​

&& :逻辑与
|| : 逻辑或
!  : 逻辑非
    [root@localhost ~]# awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd
	[root@localhost ~]# awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd
	[root@localhost ~]# awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd

​
​ 4. 算数运算

awk -F '{print $3,$3+1}' /etc/passwd
+
-
*
/
%

	案例:要求属组 + 属主的ID 大于 2000
		[root@localhost ~]# awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd
	案例:要求属组 * 属主的ID 大于 2000
		[root@localhost ~]# awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd
	案例:要求打印偶数行
		[root@localhost ~]# awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
	案例:要求打印奇数行
		[root@localhost ~]# awk -F: 'NR % 2 == 1{print $0}' /etc/passwd

5. 条件模式
    awk -F:'NR > 7' /etc/passwd

==
>
<
>=
<=
	
	案例:要求打印第三行
		[root@localhost ~]# awk -F: 'NR == 3{print $0}' /etc/passwd
6. 范围模式
    awk -F:'/root/,/ftp/{print $1}' /etc/passwd


流程控制

if 判断
    
    单分支      if () {}
    双分支      if () {} else {}
    双分支      if () {} else if () {} else {}
案例
    1. 打印奇数行的数据
        awk -F:'{if(NR % 2){print NR,$0}}' /etc/passwd
        
    2. 打印偶数行的数据
        awk -F:'{if(NR % 2 == 0){print NR,$0}}' /etc/passwd
        awk -F:'NR % 2 == 0{print $0}' /etc/passwd
    注,单分支情况下是可以省略if,多分支情况下不能省略
    
    3. 要求打印出偶数行中包含bash的行
        awk -F:'/bash/{if(NR % 2 == 0){print NR,$0}}' /etc/passwd
        
    4. 要求在奇数行前输出奇数,偶数行前输出偶数
        awk -F:'{if(NR % 2){printf "奇数行:%s\n",$0}else{printf "偶数行:%s\n",$0}}' /etc/passwd
    
    5. 在前7行前加7,前14行前加14,其他原样输出
        awk -F:'{if(NR <= 7){printf "7 %s \n",$0}else if(NR <= 14){printf "14 %s \n",$0}else{print $0}}' /etc/passwd
        
for 循环
    for (变量 in 数组) {语句}
    for (变量;条件;表达式){语句}
    
知识储备:
    ++  :每次加1
    --  :每次减1
案例
    1. 将/etc/nginx/nginx.conf 中所有词的个数
        egrep -o "[a-zA-Z0-9]+" /etc/nginx/nginx.conf | awk '{arr[$1]++}END{for(i in arr){printf "%-20s %d\n",i,arr[i]}}'
        
    2. 要求统计以#开头的行中包含词的格式
        egrep '^ *#' /etc/fstab | egrep -o "[a-zA-Z0-9]+" |awk '{arr[$1]++}END{for(i in arr){printf "%-20s %d\n",i,arr[i]}}'
        
    3. 输入一个文件路径,要求打印出它的数字权限(不允许使用stat)
        ll [路径] |awk 'BEGIN{FS=""}{if($2 == "r"){u=u+4} if($3== "w"){u=u+2} if($4 =="x"){u=u+x} if($5=="r"){g=g+4} if($6=="w"){g=g+2} if($7=="x"){g=g+1} if($8=="r"){o=o+4} if($9=="w"){o=o+2} if($10=="x"){o=o+1}}END{print u,g,o}'
while 循环
    
    格式
        while (判断条件){}
案例
    1. 把/etc/passwd中的每一行都重复打印3遍
        awk -F: '{i=0;while(i<3){print $0;i++}}' /etc/passwd
        
    2.统计/etc/passwd中每个解析器的用户数
        awk -F: '{arr[$NF]++}END{for(i in arr){print i,arr[i]}}' /etc/passwd
        
    3.要求把/etc/passwd 中第10行中每一列都打印出来
        awk -F: 'NR==10{i=0};while(i<=NF){print $i;i++}' /etc/passwd
posted on 2021-12-22 21:20  Henrywuovo  阅读(125)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3