1. 程式人生 > 其它 >linux磁碟管理、三劍客之awk語法命令詳解

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