linux磁盘管理、三剑客之awk语法命令详解

一、磁盘管理

当全新安装了一块新的硬盘设备后,为了更充分、安全的利用硬盘空间首先要进行磁盘的分区,然后格式化,最后挂载使用。

添加磁盘步骤:

添加设备->分区->格式化(创建文件系统)-> [起名]->修改配置文件->创建一个挂载点->挂载


fdisk 管理磁盘分区

fdisk命令用于管理磁盘分区,格式为:“fdisk [磁盘名称]”

管理某硬盘的分区:“fdisk /dev/sda”

常用参数 作用

m :查看全部可用的参数

n :添加新的分区

d :删除某个分区信息

l :列出所有可用的分区类型

t :改变某个分区的类型

p :查看分区表信息

w :保存并退出

q :不保存直接退出

使用fdisk命令对sdb硬盘进行分区:

[root@localhost ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x7516baf3.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): 

①写入字符p查看分区表信息(当前为空):

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x7516baf3

   Device Boot      Start         End      Blocks   Id  System

②写入字符n创建新的分区信息:

Command (m for help): n

③写入字符p,这个p代表是主分区,e为扩展分区:

Command action
   e   extended
   p   primary partition (1-4)
p

④写入数字1代表分区编号为1

Partition number (1-4): 1

⑤磁盘的起始扇区,直接回车即可:

First cylinder (1-2610, default 1): 

⑥键入+2G,代表该分区的大小为2G

Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +2G

⑦再看下分区表信息(增加了sdb1分区信息):

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x7516baf3

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         262     2104483+  83  Linux

⑨写入字符w,将上述分区信息保存:

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# 

让内核同步分区信息(此步骤仅在没有找到分区设备的情况下才需要执行,非必要动作。):

[root@localhost ~]# partprobe 

格式化文件系统。

在Linux系统中用于格式化的命令是mkfs,它支持的文件类型有:

cramfs,ext2,ext3,ext4,fat,msdos,xfs,btrfs,minix,vfat

使用方法非常的简单:"mkfs.文件类型名称",例如要格式分区为ext4,则命令为"mkfs.ext4 硬盘分区名称"

使用mkfs.ext4来对/dev/sdb1进行格式化:

[root@localhost ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131648 inodes, 526120 blocks
26306 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=541065216
17 block groups
32768 blocks per group, 32768 fragments per group
7744 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912

Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

linux磁盘管理、三剑客之awk语法命令详解

设备挂载

将硬盘设备挂载到/web目录。

[root@localhost ~]# mkdir /web
[root@localhost ~]# mount /dev/sdb1 /web/

开机自动挂载

设置系统启动后自动挂载该硬盘设备

[root@localhost ~]# vim /etc/fstab
/dev/sdb1               /web                    ext4    defaults        0 0
要挂载的分区  挂载点 文件系统类型  挂载选项    是否备份    是否检测

最后两个0

第一个0:fs_dump 是否要使用dump命令进行备份. 0为不备份,1为要备份 。

第二个0:fs_pass – 该字段被fsck命令用来决定在启动时是否需要被扫描的文件系统的顺序,根文件系统/对应该字段的值应该为1,其他文件系统应该为2。若该文件系统无需在启动 时扫描则设置该字段为0

UUID挂载

UID是一个标识你系统中的存储设备的字符串,其目的是帮助使用者唯一的确定系统中的所有存储设备,不管它们是什么类型的。它可以标识DVD驱动器,USB存储设备以及你系统中的硬盘设备等。

取消挂载点

umount命令用于撤销已经挂载的设备文件,格式为:“umount [挂载点/设备文件]”

取消对/dev/sdb1设备文件的挂载:

[root@localhost ~]# umount /dev/sdb1

特点:

它是真正的唯一标志符

Linux中的许多关键功能现在开始依赖于UUID

查找UUID

可以通过 blkid 命令获取各分区的UUID

root@localhost ~]# blkid | grep  sdb1
/dev/sdb1: LABEL="cc" UUID="11e9fc80-cd17-46fa-b0ff-0e5bdc2fd133" TYPE="ext4" 
[root@localhost ~]# tune2fs -l /dev/sdb1  | grep UUID
Filesystem UUID:          11e9fc80-cd17-46fa-b0ff-0e5bdc2fd133

Parted(gpt大于2G分区)

通常我们用的比较多的一般都是fdisk工具来进行分区,但是现在由于磁盘越来越廉价,而且磁盘空间越来越大;而fdisk工具他对分区是有大小限制的,它只能划分小于2T的磁盘。但是现在的磁盘空间很多都已经是远远大于2T了,甚至达到2.5T和3T,那要怎么办能,有两个方法,其一是通过卷管理来实现,其二就是通过我们今天谈到的Parted工具来实现对GPT磁盘进行分区操作。

然后格式化,挂载使用

查看文件系统的使用情况。

df 查看挂载信息与磁盘使用量

df命令用于查看挂载点信息与磁盘使用量,格式为:“df [选项] [文件]”

查看挂载信息与硬盘使用量:“df -h”

参数作用

-a: 显示出所有的文件系统(包括虚拟的)

--total: 展出出总体使用量

-h :更易读的容量格式如1K,234M,2G…

-i :展示出Inode的信息(默认是磁盘使用信息)

-T :显示出文件系统的类型

查看到所有已挂载的挂载信息与硬盘使用情况:

[root@localhost ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg0-root   20G  333M   19G   2% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             190M   34M  147M  19% /boot
/dev/mapper/vg0-usr   9.8G  1.9G  7.4G  21% /usr
/dev/mapper/vg0-var    20G  113M   19G   1% /var
/dev/sdb1             2.0G  3.1M  1.9G   1% /web

du 查看使用量

du命令用于查看磁盘的使用量,格式为:“ du [选项] [文件]”

查看根目录的总占用空间:du -sh /

查看当前目录下各文件所占空间:du -sh *

参数 作用

-a: 评估每个文件而非目录整体占用量。

-c :评估每个文件并计算出总占用量总和。

-h :更易读的容量格式如1K,234M,2G…

-s :仅显示占用量总和。

查看到该挂载目录的占用硬盘量:

[root@localhost ~]# du -sh /web/
20K /web/

查看分区状况lsblk

[root@localhost ~]# lsblk
NAME                MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0                  11:0    1 1024M  0 rom  
sda                   8:0    0   80G  0 disk 
├─sda1                8:1    0  200M  0 part /boot
└─sda2                8:2    0   60G  0 part 
  ├─vg0-root (dm-0) 253:0    0   20G  0 lvm  /
  ├─vg0-swap (dm-1) 253:1    0    2G  0 lvm  [SWAP]
  ├─vg0-usr (dm-2)  253:2    0   10G  0 lvm  /usr
  └─vg0-var (dm-3)  253:3    0   20G  0 lvm  /var
sdb                   8:16   0   20G  0 disk 
├─sdb1                8:17   0  1.9G  0 part 
└─sdb2                8:18   0  1.9G  0 part 

查看设备信息blkid

[root@localhost ~]# blkid
/dev/sda1: UUID="a4acde25-491e-425e-9a3c-3ccc995ee4c4" TYPE="ext4" 
/dev/sda2: UUID="qivYdT-3t0K-JdU2-1afU-lZGG-NvNt-22lYE1" TYPE="LVM2_member" 
/dev/mapper/vg0-root: UUID="e5ea11e5-157f-42b2-aba1-d92ff6002af3" TYPE="ext4" 
/dev/mapper/vg0-swap: UUID="c30b0464-2b30-45ca-ac65-79baa79af17b" TYPE="swap" 
/dev/mapper/vg0-usr: UUID="16ebdfae-1ddd-4841-9415-ea105add7857" TYPE="ext4" 
/dev/mapper/vg0-var: UUID="6d6cc476-2c4f-40a9-9e8b-b9c1f90c6fe4" TYPE="ext4"

总结

1、关机
	2、添加硬盘
	3、创建分区
		fdisk /dev/sdb
		或
		gdisk /dev/sdb
	4、格式化文件系统
		mkfs.xfs /dev/sdb1 
	5、挂载
		mount /dev/sdb1 /mnt

linux磁盘管理、三剑客之awk语法命令详解

二、三剑客之awk

  • awk是一个报告生成器,它拥有强大的文本格式化的能力

    • 你可能不理解所谓的报告生成器中的"报告"是什么,你可以把"报告"理解为"报表"或者"表格",也就是说,我们可以利用awk命令,将一些文本整理成我们想要的样子,比如把一些文本整理成"表"的样子,然后再展示出来,刚才概念中提到的"文本格式化的能力",也就是这个意思,其实这样说可能还是不太容易理解,不用着急,当你看到后面的"示例"时,自然会明白awk所擅长的"文本格式化"能力是什么。

grep 、sed、awk被称为linux中的"三剑客"。

我们总结一下这三个"剑客"的特长。

grep 更适合单纯的查找或匹配文本

sed  更适合编辑匹配到的文本

awk  更适合格式化文本,对文本进行较复杂格式处理

awk的语法

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

awk [options] 'Pattern{Action}' file

# 对于上述语法中的program来说,又可以细分成pattern和action,也就是说,awk的   基本语法如下

awk [options] 'Pattern{Action}' file

# 从字面上理解 ,action指的就是动作,awk擅长文本格式化,并且将格式化以后的文   本输出,所以awk最常用的动作就是print和printf,因为awk要把格式化完成后的文   本输出啊,所以,这两个动作最常用。

# 我们先从最简单用法开始了解awk,我们先不使用[options] ,也不指定pattern,直   接使用最简单的action,从而开始认识awk,示例如下

linux磁盘管理、三剑客之awk语法命令详解

上图中,我们只是使用awk执行了一个打印的动作,将testd文件中的内容打印了出来。

  • 好了,现在,我们来操作一下另一个类似的场景。

linux磁盘管理、三剑客之awk语法命令详解

#	上图中的示例没有使用到options和pattern,上图中的awk '{print $5}',表示输	出df的信息的第5列,$5表示将当前行按照分隔符分割后的第5列,不指定分隔符时,默认使用空格作为分隔符,细心的你一定发现了,上述信息用的空格不止有一个,而是有连续多个空格,awk自动将连续的空格理解为一个分割符了,是不是比cut命令要简单很多,这样比较简单的例子,有利于我们开始了解awk。

awk是逐行处理的,逐行处理的意思就是说,当awk处理一个文本时,会一行一行进行处理,处理完当前行,再处理下一行,awk默认以"换行符"为标记,识别每一行,也就是说,awk跟我们人类一样,每次遇到"回车换行",就认为是当前行的结束,新的一行的开始,awk会按照用户指定的分割符去分割当前行,如果没有指定分割符,默认使用空格作为分隔符。

linux磁盘管理、三剑客之awk语法命令详解

$0 表示显示整行 ,$NF表示当前行分割后的最后一列($0和$NF均为内置变量)

注意,$NF 和 NF 要表达的意思是不一样的,对于awk来说,$NF表示最后一个字段,NF表示当前行被分隔符切开以后,一共有几个字段。

也就是说,假如一行文本被空格分成了7段,那么NF的值就是7,$NF的值就是$7,  而$7表示当前行的第7个字段,也就是最后一列,那么每行的倒数第二列可以写为$(NF-1)。
  • 我们也可以一次输出多列,使用逗号隔开要输出的多个列,如下,一次性输出第一列和第二列:

linux磁盘管理、三剑客之awk语法命令详解

  • 同理,也可以一次性输出多个指定的列,如下图

linux磁盘管理、三剑客之awk语法命令详解

我们发现,第一行并没有第5列,所以并没有输出任何文本,而第二行有第五列,所以输出了

  • 除了输出文本中的列,我们还能够添加自己的字段,将自己的字段与文件中的列结合起来,如下做法,都是可以的。

linux磁盘管理、三剑客之awk语法命令详解

从上述实验中可以看出,awk可以灵活的将我们指定的字符与每一列进行拼接,或者把指定的字符当做一个新列插入到原来的列中,也就是awk格式化文本能力的体现。

  • 但是要注意,$1这种内置变量的外侧不能加入双引号,否则$1会被当做文本输出,示例如下

linux磁盘管理、三剑客之awk语法命令详解

  • 我们也可以输出整行,比如,如下两种写法都表示输出整行。

linux磁盘管理、三剑客之awk语法命令详解

#  而且我们说过awk是逐行处理的, 刚才已经说过了最常用的Action:print
AWK 包含两种特殊的模式:BEGIN 和 END。

BEGIN 模式指定了处理文本之前需要执行的操作:

END 模式指定了处理完所有行之后所需要执行的操作:
  • 什么意思呢?光说不练不容易理解,我们来看一些小例子,先从BEGIN模式开始,示例如下

linux磁盘管理、三剑客之awk语法命令详解

上述写法表示,在开始处理a.txt文件中的文本之前,先执行打印动作,输出的内容为"aaa","bbb".

也就是说,上述示例中,虽然指定了a.txt文件作为输入源,但是在开始处理a.txt文本之前,需要先执行BEGIN模式指定的"打印"操作

  • 既然还没有开始逐行处理a.txt文件中的文本,那么是不是根本就不需要指定a.txt文件呢,我们来试试

linux磁盘管理、三剑客之awk语法命令详解

经过实验发现,还真是,我们并没有给定任何输入来源,awk就直接输出信息了,因为,BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作,而上述示例没有给定任何输入源,但是awk还是会先执行BEGIN模式指定的"打印"动作,打印完成后,发现并没有文本可以处理,于是就只完成了"打印 aaa bbb"的操作
  • 这个时候,如果我们想要awk先执行BEGIN模式指定的动作,再根据执我们自定义的动作去操作文本,该怎么办呢?示例如下

linux磁盘管理、三剑客之awk语法命令详解

上图中,蓝色标注的部分表示BEGIN模式指定的动作,这部分动作需要在处理指定的文本之前执行,所以,上图中先打印出了"aaa bbb",当BEGIN模式对应的动作完成后,在使用后面的动作处理对应的文本,即打印a.txt文件中的第一列与第二列,这样解释应该比较清楚了吧。
  • 看完上述示例,似乎更加容易理解BEGIN模式是什么意思了,BEGIN模式的作用就是,在开始逐行处理文本之前,先执行BEGIN模式所指定的动作。以此类推,END模式的作用就一目了然了,举例如下

linux磁盘管理、三剑客之awk语法命令详解

  • END模式就是在处理完所有的指定的文本之后,需要指定的动作。

    那么,我们可以结合BEGIN模式和END模式一起使用。示例如下

linux磁盘管理、三剑客之awk语法命令详解

  • 上述示例中返回的结果有没有很像一张"报表",有"表头" 、"表内容"、 "表尾",awk对文本的格式化能力你体会到了吗?

1、参数
	-F : 指定文本分隔符(默认是以空格作为分隔符)
		awk -F'f' '{print $NF}' 9.txt

	案例:打印系统所有用户的解析器
		awk -F: '{print $NF}' /etc/passwd
2、awk的生命周期
	grep、sed和awk都是读一行处理一行,直至处理完成。
	
	1、接收一行作为输入
	2、把刚刚读入进来得到文本进行分解
	3、使用处理规则处理文本
	4、输入一行,赋值给$0,直至处理完成
	5、把处理完成之后的所有的数据交给END{}来再次处理

3、awk中的预定义变量
	$0	: 代表当前行
		[root@localhost ~]# awk -F: '{print $0, "---"}' /etc/passwd
	$n	:代表第n列
		[root@localhost ~]# awk -F: '{print $1}' /etc/passwd	
	NF  :记录当前行的字段数
		[root@localhost ~]# awk -F: '{print NF}' /etc/passwd
		[root@localhost ~]# awk -F: '{print $NF}' /etc/passwd
	NR	:用来记录行号
		[root@localhost ~]# awk -F: '{print NR}' /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

4、awk处理规则的执行流程
	
	BEGIN{}		
	//
	{}
	END{}
	
5、awk中的函数
	print	: 打印
	printf	:格式化打印
		%s	: 字符串
		%d	:数字
		-   :左对齐
		+   :右对齐
		15  : 至少占用15字符
	[root@localhost ~]# awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF,$1}' /etc/passwd

6、awk中的定位
	
	1、正则表达式
		[root@localhost ~]# awk -F: '/root/{print $0}' /etc/passwd
		[root@localhost ~]# awk -F: '/^root/{print $0}' /etc/passwd

	2、比较表达式
	
		>
		<
		>=
		<=
		~		正则匹配
		!~       正则匹配(取反)
		案例:要求打印属组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、算术表达式

		+
		-
		*
		/
		%

		案例:要求属组 + 属主的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、条件表达式
	
		==
		>
		<
		>=
		<=
		
		案例:要求打印第三行
			[root@localhost ~]# awk -F: 'NR == 3{print $0}' /etc/passwd
		
	6、范围表达式
		
		[root@localhost ~]# awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd

流程控制

只存在循环之中。
	if
		[root@localhost ~]# awk -F: '{if($3>$4){print "大于"}else{print "小于或等于"}}' /etc/passwd
			
			if(){}
			if(){}else{}
			if(){}else if(){}else{}
	for
		
		[root@localhost ~]# awk -F: '{for(i=10;i>0;i--){print $0}}' /etc/passwd
		
		for(i="初始值";条件判断;游标){}
		
	while
	
		[root@localhost ~]# awk -F: '{i=1; while(i<10){print $0, i++}}' /etc/passwd
	
		while(条件判断){}

	
    每隔5行,打印一行横线
    -------------------------------------------------------------------------
    
    [root@localhost ~]# awk -F: '{if(NR%5==0){print "----------------"}print $0}' /etc/passwd
上一篇:三剑客6_awk


下一篇:[Contest on 2021.9.2] 读不懂题啊!