linux磁盘管理、三剑客之awk语法命令详解
2021/12/23 7:08:23
本文主要是介绍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.
设备挂载
将硬盘设备挂载到/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
二、三剑客之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,示例如下
上图中,我们只是使用awk执行了一个打印的动作,将testd文件中的内容打印了出来。
-
好了,现在,我们来操作一下另一个类似的场景。
# 上图中的示例没有使用到options和pattern,上图中的awk '{print $5}',表示输 出df的信息的第5列,$5表示将当前行按照分隔符分割后的第5列,不指定分隔符时,默认使用空格作为分隔符,细心的你一定发现了,上述信息用的空格不止有一个,而是有连续多个空格,awk自动将连续的空格理解为一个分割符了,是不是比cut命令要简单很多,这样比较简单的例子,有利于我们开始了解awk。 awk是逐行处理的,逐行处理的意思就是说,当awk处理一个文本时,会一行一行进行处理,处理完当前行,再处理下一行,awk默认以"换行符"为标记,识别每一行,也就是说,awk跟我们人类一样,每次遇到"回车换行",就认为是当前行的结束,新的一行的开始,awk会按照用户指定的分割符去分割当前行,如果没有指定分割符,默认使用空格作为分隔符。
$0 表示显示整行 ,$NF表示当前行分割后的最后一列($0和$NF均为内置变量)
注意,$NF 和 NF 要表达的意思是不一样的,对于awk来说,$NF表示最后一个字段,NF表示当前行被分隔符切开以后,一共有几个字段。 也就是说,假如一行文本被空格分成了7段,那么NF的值就是7,$NF的值就是$7, 而$7表示当前行的第7个字段,也就是最后一列,那么每行的倒数第二列可以写为$(NF-1)。
-
我们也可以一次输出多列,使用逗号隔开要输出的多个列,如下,一次性输出第一列和第二列:
-
同理,也可以一次性输出多个指定的列,如下图
我们发现,第一行并没有第5列,所以并没有输出任何文本,而第二行有第五列,所以输出了
-
除了输出文本中的列,我们还能够添加自己的字段,将自己的字段与文件中的列结合起来,如下做法,都是可以的。
从上述实验中可以看出,awk可以灵活的将我们指定的字符与每一列进行拼接,或者把指定的字符当做一个新列插入到原来的列中,也就是awk格式化文本能力的体现。
-
但是要注意,$1这种内置变量的外侧不能加入双引号,否则$1会被当做文本输出,示例如下
-
我们也可以输出整行,比如,如下两种写法都表示输出整行。
# 而且我们说过awk是逐行处理的, 刚才已经说过了最常用的Action:print AWK 包含两种特殊的模式:BEGIN 和 END。 BEGIN 模式指定了处理文本之前需要执行的操作: END 模式指定了处理完所有行之后所需要执行的操作:
-
什么意思呢?光说不练不容易理解,我们来看一些小例子,先从BEGIN模式开始,示例如下
上述写法表示,在开始处理a.txt文件中的文本之前,先执行打印动作,输出的内容为"aaa","bbb".
也就是说,上述示例中,虽然指定了a.txt文件作为输入源,但是在开始处理a.txt文本之前,需要先执行BEGIN模式指定的"打印"操作
-
既然还没有开始逐行处理a.txt文件中的文本,那么是不是根本就不需要指定a.txt文件呢,我们来试试
经过实验发现,还真是,我们并没有给定任何输入来源,awk就直接输出信息了,因为,BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作,而上述示例没有给定任何输入源,但是awk还是会先执行BEGIN模式指定的"打印"动作,打印完成后,发现并没有文本可以处理,于是就只完成了"打印 aaa bbb"的操作
-
这个时候,如果我们想要awk先执行BEGIN模式指定的动作,再根据执我们自定义的动作去操作文本,该怎么办呢?示例如下
上图中,蓝色标注的部分表示BEGIN模式指定的动作,这部分动作需要在处理指定的文本之前执行,所以,上图中先打印出了"aaa bbb",当BEGIN模式对应的动作完成后,在使用后面的动作处理对应的文本,即打印a.txt文件中的第一列与第二列,这样解释应该比较清楚了吧。
-
看完上述示例,似乎更加容易理解BEGIN模式是什么意思了,BEGIN模式的作用就是,在开始逐行处理文本之前,先执行BEGIN模式所指定的动作。以此类推,END模式的作用就一目了然了,举例如下
-
END模式就是在处理完所有的指定的文本之后,需要指定的动作。
那么,我们可以结合BEGIN模式和END模式一起使用。示例如下
-
上述示例中返回的结果有没有很像一张"报表",有"表头" 、"表内容"、 "表尾",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
这篇关于linux磁盘管理、三剑客之awk语法命令详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法