一、磁盤管理
當全新安裝了一塊新的硬盤設備后,為了更充分、安全的利用硬盤空間首先要進行磁盤的分區,然后格式化,最后掛載使用。
添加磁盤步驟:
添加設備->分區->格式化(創建文件系統)-> [起名]->修改配置文件->創建一個掛載點->掛載
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