linux磁盤管理、三劍客之awk語法命令


image

一、磁盤管理

當全新安裝了一塊新的硬盤設備后,為了更充分、安全的利用硬盤空間首先要進行磁盤的分區,然后格式化,最后掛載使用。

添加磁盤步驟:

添加設備->分區->格式化(創建文件系統)-> [起名]->修改配置文件->創建一個掛載點->掛載


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM