磁盘管理 . 三剑客awk


磁盘管理

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

1、挂载磁盘的步骤
	1、磁盘分区 
	2、挂载

2、磁盘分区
	fdisk:分区2TB以下的磁盘,最多可以分4个分区
	[root@test-10.4 ~]# yum install gdisk -y

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

3、添加一块磁盘
	lsblk   : 查看本机的磁盘
	df -h   :  查看本机的分区
	
	[root@test-10.4 ~]# lsblk
	NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
	sda      8:0    0   20G  0 disk 
	├─sda1   8:1    0    1G  0 part /boot
	└─sda2   8:2    0   19G  0 part /
	sdb      8:16   0  200G  0 disk 
	sr0     11:0    1  4.3G  0 rom  
	[root@test-10.4 ~]# df -h
	文件系统        容量  已用  可用 已用% 挂载点
	/dev/sda2        19G  1.5G   18G    8% /
	devtmpfs        900M     0  900M    0% /dev
	tmpfs           910M     0  910M    0% /dev/shm
	tmpfs           910M  9.6M  901M    2% /run
	tmpfs           910M     0  910M    0% /sys/fs/cgroup
	/dev/sda1      1014M  138M  877M   14% /boot
	tmpfs           182M     0  182M    0% /run/user/0

4、磁盘分区
	n : 新建一个分区
	p : 打印分区表
	w : 写入磁盘并退出
	q : 退出
	d : 删除一个分区
	
5、挂载磁盘分区
	1、格式化文件系统
		mkfs.xfs /dev/sdb1 

6、总结
	1、关机
	2、添加硬盘
	3、创建分区
		fdisk /dev/sdb
		或
		gdisk /dev/sdb
	4、格式化文件系统
		mkfs.xfs /dev/sdb1 
	5、挂载
		mount /dev/sdb1 /mnt
		
[root@test-10.4 ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0xa0b907c6 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xa0b907c6

   设备 Boot      Start         End      Blocks   Id  System

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+1G
分区 1 已设置为 Linux 类型,大小设为 1 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xa0b907c6

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@test-10.4 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   20G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
└─sda2   8:2    0   19G  0 part /
sdb      8:16   0   20G  0 disk 
└─sdb1   8:17   0    1G  0 part 
sr0     11:0    1  4.3G  0 rom  
[root@test-10.4 ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xa0b907c6

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux

命令(输入 m 获取帮助):n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
分区号 (2-4,默认 2):
起始 扇区 (2099200-41943039,默认为 2099200):+2G
Last 扇区, +扇区 or +size{K,M,G} (4194304-41943039,默认为 41943039):
将使用默认值 41943039
分区 2 已设置为 Linux 类型,大小设为 18 GiB

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@test-10.4 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   20G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
└─sda2   8:2    0   19G  0 part /
sdb      8:16   0   20G  0 disk 
├─sdb1   8:17   0    1G  0 part 
└─sdb2   8:18   0   18G  0 part 
sr0     11:0    1  4.3G  0 rom 

***************************************************
[root@test-10.4 ~]# mount /dev/sdb1 /mnt/
mount: /dev/sdb1 写保护,将以只读方式挂载
mount: 未知的文件系统类型“(null)”
[root@test-10.4 ~]# mkf
mkfifo       mkfs.btrfs   mkfs.ext2    mkfs.ext4    mkfs.xfs
mkfs         mkfs.cramfs  mkfs.ext3    mkfs.minix   
[root@test-10.4 ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

***************************************************
[root@test-10.4 ~]# fdisk /dev/sdc
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x8d34f978 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):^C
[root@test-10.4 ~]# gdisk /dev/sdc
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help): /^H
b	back up GPT data to a file
c	change a partition's name
d	delete a partition
i	show detailed information on a partition
l	list known partition types
n	add a new partition
o	create a new empty GUID partition table (GPT)
p	print the partition table
q	quit without saving changes
r	recovery and transformation options (experts only)
s	sort partitions
t	change a partition's type code
v	verify disk
w	write table to disk and exit
x	extra functionality (experts only)
?	print this menu

Command (? for help): ?
b	back up GPT data to a file
c	change a partition's name
d	delete a partition
i	show detailed information on a partition
l	list known partition types
n	add a new partition
o	create a new empty GUID partition table (GPT)
p	print the partition table
q	quit without saving changes
r	recovery and transformation options (experts only)
s	sort partitions
t	change a partition's type code
v	verify disk
w	write table to disk and exit
x	extra functionality (experts only)
?	print this menu

Command (? for help): n
Partition number (1-128, default 1): 
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: 1G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): p
Disk /dev/sdc: 41943040 sectors, 20.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): A27C37AB-C8B2-4CE3-B245-0ED32F7A685D
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 39847868 sectors (19.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2097152   1023.0 MiB  8300  Linux filesystem

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.

awk

awk主要是用来格式化文本。
1、awk的语法
	awk [参数] [处理规则] [操作对象]
	
	[root@test-10.4 ~]# cat Ttnizi.txt 
	Hello Ttnizi
	dg gsj hufuua
	dfht rjc poqwh 
	ghjcg
	[root@test-10.4 ~]# awk '{print $NR}' Ttnizi.txt 
	Hello
	gsj
	poqwh

	[root@test-10.4 ~]# awk '{print $NF}' Ttnizi.txt 
	Ttnizi
	hufuua
	poqwh
	ghjcg
	
2、参数
	-F : 指定文本分隔符(默认是以空格作为分隔符)
		awk -F'f' '{print $NF}' Ttnizi.txt
	[root@test-10.4 ~]# cat Ttnizi.txt 
	Hello Ttnizi
	dg gsj hufuua
	[root@test-10.4 ~]# awk -F'f' '{print $NF}' Ttnizi.txt 
	Hello Ttnizi
	uua
	
	案例:打印系统所有用户的解析器
		awk -F: '{print $NF}' /etc/passwd
	[root@test-10.4 ~]#  cat /etc/passwd
	nginx:x:998:996:nginx user:/var/cache/nginx:/sbin/nologin
	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
	[root@test-10.4 ~]# awk -F: '{print $NF}' /etc/passwd
	/sbin/nologin
	/sbin/nologin

		
3、awk的生命周期
	grep、sed和awk都是读一行处理一行,直至处理完成。
	
	1、接收一行作为输入 
	2、把刚刚读入进来得到文本进行分解
	3、使用处理规则处理文本
	4、输入一行,赋值给$0,直至处理完成
	5、把处理完成之后的所有的数据交给END{}来再次处理

4、awk中的预定义变量
	$0	: 代表当前行
		[root@localhost ~]# awk -F: '{print $0, "---"}' /etc/passwd
		root:x:0:0:root:/root:/bin/bash ---
		bin:x:1:1:bin:/bin:/sbin/nologin ---

	$n	:代表第n列
		[root@test-10.4 ~]# awk -F: '{print $1}' /etc/passwd
		root
		bin

	NF  :记录当前行的字段数
		[root@localhost ~]# awk -F: '{print NF}' /etc/passwd
		7
		7
		[root@localhost ~]# awk -F: '{print $NF}' /etc/passwd
		/bin/bash
		/sbin/nologin
		
	NR	:用来记录行号
		[root@localhost ~]# awk -F: '{print NR}' /etc/passwd
		1
		2
		3
	FS  :指定文本内容分隔符(默认是空格)
		[root@localhost ~]# awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd
		/bin/bash root
		/sbin/nologin bin
		
		FS 的优先级要高于 -F
	OFS :指定打印分隔符(默认空格)
		[root@localhost ~]# awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd
		root:x:0:0:root:/root:/bin/bash >>> root:x:0:0:root:/root:/bin/bash
		bin:x:1:1:bin:/bin:/sbin/nologin >>> bin:x:1:1:bin:/bin:/sbin/nologin

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

	
7、awk中的定位
	
	1、正则表达式
		[root@localhost ~]# awk -F: '/root/{print $0}' /etc/passwd
		root:x:0:0:root:/root:/bin/bash
		operator:x:11:0:operator:/root:/sbin/nologin
		
		[root@localhost ~]# awk -F: '/^root/{print $0}' /etc/passwd
		root:x:0:0:root:/root:/bin/bash

	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

8、流程控制
	只存在循环之中。
	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