Linux中磁碟管理與三劍客之awk初識

  • 2021 年 12 月 22 日
  • 筆記

昨日內容回顧

1.用兩種方法實現 將文件中以 # 開頭的行 把 # 去掉
	sed -r 's/^ *#//g' /etc/fstab
	cat /etc/fstab | tr -d '^#'
    
2.將文件中的Hello World 替換成 World Hello
	sed -r 's/Hello World/World Hello/g' 1.txt
	awk '{print $2,$1}' 1.txt
    
3.刪除一個文本中所有的數字
	sed 's/[0-9]//g' 1.txt
	cat 1.txt | tr -d [0-9]

今日內容概要

  • 磁碟管理
  • 三劍客之awk初識

磁碟管理

# Linux系統中磁碟管理 就是將硬碟通過掛載的方式 掛載到linux文件系統中

# 掛載步驟
	1.新建磁碟
		01.將虛擬機關機 
		02.選擇 編輯虛擬機設置
		03.選擇 添加
		04.選擇 磁碟 一直下一步
		05.完成
        
	2.執行分區操作
		fdisk :	分區2TB以下的磁碟 最多可以分4個分區
			參數:
				n :	新建一個分區
				p :	列印分區表
				w :	寫入磁碟並退出
				q :	退出
				d :	刪除一個分區
			01.執行 fdisk /dev/sdb 進入分區操作
			02.按 n 
			03.直接 enter 到 Last 扇區, +扇區 or +size{K,M,G}選項
			04.手動添加 +100G 
			05.按 w 保存退出
			06.格式化文件系統 mkfs.xfs /dev/sdb1 
			07.掛載 mount /dev/sdb1 /mnt
            
		gdisk :	分區2TB以上的磁碟 最多可以分128個分區
			步驟等同於 fdisk
            
# 查看系統磁碟資訊
	lsblk :	查看本機的磁碟(包含未掛載的)
	df -h :	查看本機的分區(僅顯示已經掛載的)

image

image

image

image

image

image

image

image

image

三劍客之awk

'''
awk主要是用來格式化輸出文本
grep、sed和awk都是讀一行處理一行 直至處理完成
'''

# 1.語法格式
	awk [參數] [處理規則] [操作對象]
	
	參數:
		-F :	指定文本的分隔符(不指定的話 默認為 空格)
		案例:
			awk -F'f' '{print $2}' 1.txt  # 顯示以 f 分隔後的第二列內容
			awk -F '{print $2}' 1.txt  # 顯示以 空格 分隔後的第二列內容
            
			列印系統所有用戶的解析器
			awk -F: '{print $NF}' /etc/passwd  # 以 :分隔 顯示最後一列內容
                
# 2.awk的生命周期
	01. 接收一行內容作為輸入
    02. 把剛剛接收到的文本進行分解
    03. 使用處理規則處理文本
    04. 讀取一行 賦值給 $0 直至處理完成
    05. 把處理完成之後的所有數據 交給 END{} 來再次處理
    
# 3.awk中的預定義變數
	$0 :	代表當前行
        案例:
            awk -F: '{print $0, "---"}' /etc/passwd  # 輸出每行內容 並且每行最後會加上 ---
                
    $n :	代表第n列(0 除外)
        案例:
            awk -F: '{print $1}' /etc/passwd  # 以 :分隔後 輸出第一列內容
                
	NF :	記錄當前行的欄位數
        案例:
            awk -F: '{print NF}' /etc/passwd  # 輸出每一行按 :分隔後的列數
                
	NR :	用來記錄行號
        案例:
            awk -F: '{print NR}' /etc/passwd  # 將文本內容替換成行號輸出
                
	FS :	指定文本的分隔符(不指定的話 默認為 空格)
        案例:
            awk 'BEGIN{FS=":"}{print $NF}' /etc/passwd  # 以:分隔 輸出最後一列內容
            等同於 -F 作用 
            但是如果同時用 以 FS 指定的分隔符優先
            
	OFS :	指定列印分隔符(不指定的話 默認為 空格)
        案例:
            同時輸出不止一項內容時 默認按空格分隔輸出顯示
            awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd  # 輸出的最後一列內容 和 第一列內容 中間以 >>> 分隔
                
# 4.awk處理規則的執行流程
	BEGIN{} :	定義變數
    // 		:	正則
    {} 		:	循環
    END{}	:	輸出之前最後再統一處理一次(如果沒有出現 就沒有任何效果)
	'''
	在 awk 語法中 至少有一個流程 最多可以同時有四個流程
	執行順序就是從上往下 一次執行
	'''
        
# 5.awk中的函數
	"""函數只能夠寫在 循環之中{}"""
	print  :	列印
	printf :	格式化列印
	%s :		字元串佔位
	%d :		數字佔位
	-  :		左對齊
	+  :		右對齊
	15 :		至少佔位15個字元(自由定義)
            
		案例:
			awk -F: 'BEGIN{OFS=" | "}{printf "|%s|%s|\n", $NF,$1}' /etc/passwd  
			# 將文件內容以 | 分隔後 輸出最後一列和第一列 並且用 | 分隔顯示 顯示的內容繼續按每行顯示(\n 換行)
                
			awk -F: 'BEGIN{OFS=" | "}{printf "|%-15s|%-15s|\n", $NF,$1}' /etc/passwd  
			# 將文件內容以 | 分隔後 輸出最後一列和第一列 並且用 | 分隔顯示 並且顯示的每列內容至少要有15位字元 
			# 如果當列內容不夠佔位數 則用空格頂替
			# 如果當列內容多餘指定佔位數 則分隔符移至內容末尾 再繼續當前行的下一列                
# 6.awk中的定位
	01.正則定位
		awk -F: '/root/{print $0}' /etc/passwd  # 顯示文件中含有 root 的所有行
    	
		awk -F: '/^root/{print $0}' /etc/passwd  # 顯示文件中以 root 開頭的行
            
	02.比較定位(比較文本內的內容)
		>  :	大於
		<  :	小於
		>= :	大於等於
		<= :	小於等於
		~  :	正則匹配(後面跟匹配規則)
		!~ :	正則匹配(後面跟匹配規則 但取反)
        
		案例:
			列印屬組ID大於屬主ID的行 passwd文件中以 :分隔 第三列是屬主 第四列是屬組
			awk -F: '$4 > $3{print $0}' /etc/passwd  # 以 :分隔 列印大於號比較之後的結果行
                
			列印結尾包含bash的行
			awk -F: '$NF ~ /bash/{print $0}' /etc/passwd  # 以 :分隔 最後一列進行正則匹配 輸出匹配到的行
                
			列印結尾不包含bash的行(取反)
			awk -F: '$NF !~ /bash/{print $0}' /etc/passwd  # 以 :分隔 最後一列進行正則匹配 輸出匹配到的行(匹配到的行都是最後一列 不包含bash的)
    
	03.邏輯定位
		&& :	邏輯 與(同時滿足前後條件)
		|| :	邏輯 或(滿足一個條件即可)
		!  :	邏輯 非(只取不符合條件的)
		案例:
			awk -F: '$3 + $4 > 100 && $3 * $4 > 200{print $0}' /etc/passwd  # 輸出 第三列+第四列大於100 且 第三列*第四列大於200 的行
            
			awk -F: '$3 + $4 > 500 || $3 * $4 > 2000{print $0}' /etc/passwd  # 輸出 第三列+第四列大於500 或者是 第三列*第四列大於2000 的行
                
			awk -F: '!($3 + $4 > 500){print $0}' /etc/passwd  # 輸出 第三列+第四列不大於500的行(符合條件的都隱藏不列印)   
    
	04.算數定位(要保證計算的對象是 純數字)
		+ :	加
		- :	減
		* :	乘
		/ :	除
		% :	模(取整除後的 余)
		案例:
			awk -F: '$3 + $4 > 1000{print $0}' /etc/passwd  # 列印屬主id 加 屬組id的和大於1000的行
                
			awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd  # 列印屬主id 乘 屬組id的和大於2000的行    
                
			awk -F: 'NR % 2 == 0{print $0}' /etc/passwd  # 列印 行號除2的商為整數(余值是0)的行  就是列印偶數行
                
			awk -F: 'NR % 2 == 1{print $0}' /etc/passwd  # 列印 行號除2的商為整數(余值是1)的行  就是列印奇數行
    
	05.條件定位(比較文本內容之外 我們賦予的內容 例如: 行號)
		== :	等於
		>  :	大於
		<  :	小於
		>= :	大於等於
		<= :	小於等於
		案例:
			要求列印第2行內容
			awk -F: 'NR == 2{print $0}' /etc/passwd  # 列印行號為 2 的行
    
	06.範圍定位(開頭 結尾 之間用逗號隔開)
		awk -F: '/^root/,/^lp/{print $0}' /etc/passwd  # 列印 以root開頭行 到以lp開頭行(列印整個範圍)
    
# 7.流程式控制制
	'''只能寫在循環{}中'''
	if 語法:
		if(){}
		if(){}else{}
		if(){}else if(){}else{}
		案例:
			awk -F: '{if($3>$4){print "大於"}else{print "小於或等於"}}' /etc/passwd  # 輸出的行內容為:(如果條件成立)輸出大於 (如果條件不成立)輸出小於或等於
    
	for 語法:
		for(i="初始值";條件判斷;游標){}
		'''
		初始值:循環結束的規則
		條件判斷:定義循環的起始條件
		游標:固定執行規則
		'''
        
		案例:
			awk -F: '{for(i=10;i>0;i--){print $0}}' /etc/passwd  # 文本內容每行列印10遍
			'''
			i 等於 10 結束循環 但是本次循環執行
			i 大於 0 定義循環的起始條件
			i++ 每次循環i加1
			'''
			i 等於 0 列印當前行
			i 等於 1 列印當前行
			...
			i 等於 10 列印當前行 並且 for循環結束 
            
			開始讀取下一行內容並重新執行 for循環
			i 等於 0 列印當前行
			i 等於 1 列印當前行
			...
			i 等於 10 列印當前行 並且 for循環結束
			...
			一直列印到全部文本內容結束
            
	while 語法:
		while(條件判斷){}
        
		案例:
			awk -F: '{i=0; while(i<10){print $0, i++}}' /etc/passwd  # 文本內容每行列印9遍
			'''
			i 等於 0 定義循環的起始條件
			i 等於 10 結束循環 但是本次循環不執行
			i++ 每次循環i加1
			'''
			i 等於 0 列印當前行
			i 等於 1 列印當前行
			...
			i 等於 10 循環結束 當次不執行
            
			開始讀取下一行內容並重新執行 while循環
			i 等於 0 列印當前行
			i 等於 1 列印當前行
			...
			i 等於 10 循環結束 當次不執行
			...
			一直列印到全部文本內容結束
            
            
# 練習
	每隔5行,列印一行橫線
	awk -F: '{if(NR%5==0){print "----------------"}print $0}' /etc/passwd  # 行號整除5的行(余值為0)之後 列印---- 再繼續處理後續內容