ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2021-12-22 21:05:34  阅读:289  来源: 互联网

标签:dev etc awk linux print root localhost 三剑客


一、磁盘管理

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

添加磁盘步骤:

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


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.

image

设备挂载

将硬盘设备挂载到/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

image

二、三剑客之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,示例如下

image

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

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

image

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

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

image

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

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

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

image

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

image

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

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

image

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

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

image

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

image

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

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

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

image

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

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

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

image

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

image

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

image

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

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

image

  • 上述示例中返回的结果有没有很像一张"报表",有"表头" 、"表内容"、 "表尾",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

标签:dev,etc,awk,linux,print,root,localhost,三剑客
来源: https://www.cnblogs.com/lintianlong/p/15721050.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有