1. 程式人生 > 其它 >Linux三劍客awk/磁碟分割槽

Linux三劍客awk/磁碟分割槽

磁碟分割槽

Linux系統中磁碟管理就是將硬碟通過掛載的方式掛載到linux檔案系統中。

磁碟分割槽步驟
檢視本機的磁碟:lsblk
檢視本機的分割槽:df -h

1、關機
2、新增硬碟
3、建立分割槽
    fdisk /dev/sdb
	fdisk:分割槽2TB以下的磁碟,最多可以分4個分割槽
    gdisk /dev/sdb
	gdisk:分割槽2TB以上的磁碟,最多可以分128個分割槽
	磁碟分割槽:
		n 新建一個分割槽
		p 列印分割槽表
		w 寫入磁碟並且退出
		q 退出
		d 刪除一個分割槽
4、格式化檔案系統
    mkfs.xfs /dev/sdb1 
5、掛載
    mount /dev/sdb1 /mnt

awk

一、定義

awk主要擅長處理有規律的文字,主要用於做一些格式話文字,將文字按照指定的格式輸出

二、格式

awk [引數] [處理規則] [操作物件]

三、引數

-F : 指定文字分隔符(預設是以空格作為分隔符)
案例:列印系統所有使用者的解析器
      awk -F: '{print $NF}' /etc/passwd

四、awk生命週期

1、awk會接收一行作為輸入,並將這一行賦給awk的內部變數$0,每一行也可稱為一個記錄,行的邊界是以換行符作為結束
2、然後,剛剛讀入的行被以:為分隔符分解成若干欄位(或域),每個欄位儲存在已編號的變數中,編號從$1開始,最多達100個欄位
⚠️如果未指定行分隔符,awk將使用內建變數FS的值作為預設的行分隔符,FS預設值為空格,如果說要指定分隔符,需要使用-F引數或者重新定義FS變數
3、使用print函式列印,如果$1$3之間沒有逗號,它倆在輸出時將貼在一起,應該在$1,$3之間加逗號,該逗號與awk的內建變數OFS保持一致,OFS預設為空格,於是以空格為分隔符輸出$1和$3
我們可以指定:awk -F: 'BEGIN{OFS="-"}{print $1,$3}' /etc/passwd     
4、輸出之後,將從檔案中獲取另一行,然後覆蓋給$0,繼續(2)的步驟將該行內容分隔成欄位。。。繼續(3)的步驟,該過程一直持續到所有行處理完畢

簡潔版

1、awk會讀取檔案的一行內容然後賦值給$0
2、然後awk會以-F指定的分隔符將該行切分成n段,最多可以達到100段,第一段給$1,第二段給$2,依次次類推
3、print輸出該行的第一段和第三段,逗號代表輸出分隔符,預設與-F保持一致
4、重複步驟1,2,3直到檔案內容讀完

五、awk處理規則的執行流程

BEGIN{} --> 是在awk處理文字之前執行     
// -->使用正則
	$1 ~ /正則/ -->第一段內容匹配成功正則
	$1 !~ /正則/ -->第一段內容沒有匹配成功正則
{} -->迴圈(每次只處理一行資料)
END{} -->當所有的處理全部執行完畢之後,執行END{}中的相關操作

六、awk中的預定義變數

$0 # 表示當前行
[root@judyju ~]# awk -F: '{print $0}' /etc/passwd 
	每次都列印當前行,這行命令就是列印文字的每一行內容
$n # 表示第幾列
[root@judyju ~]# awk -F: '{print $1}' /etc/passwd 
	列印第1列
NF # 表示當前行的欄位數
[root@judyju ~]# awk -F: '{print NF}' /etc/passwd
NR # 用來記錄行號
[root@judyju ~]# awk -F: '{print NR,$0}' /etc/passwd 
	該行命令表示列印文字全部內容並且將行號標註出
FS # 指定文字內容的分隔符(預設是空格)
[root@judyju ~]# awk 'BEGIN{FS="/"}{print $1}' /etc/passwd
OFS # 指定輸出文字的分隔符(預設是空格)
[root@judyju ~]# awk -F: 'BEGIN{OFS="+++"}{print $1,$2}' /etc/passwd
	⚠️$1$2中間必須加逗號,這個逗號預設和OFS定義的變數一致的

七、awk中的函式

print # 列印 
printf # 格式化列印
%s # 字串
%d # 數字
- # 左對齊
+ # 右對齊-->預設右對齊
15 # 佔用15個位元組
[root@judyju ~]# awk -F: 'BEGIN{OFS="|"}{printf "%-15s|%-15s\n", $1,$2}' /etc/passwd
⚠️ 值得注意的是:printf後面需要格式化輸出的部需要引號引起來

八、awk中的定位

1、正則表示式
/正則規則/
[root@judyju ~]# awk -F: '/'judy'/{print $0}' /etc/passwd
2、比較表示式
	> 大於
	< 小於
	>= 大於等於
	<= 小於等於
	~ 正則匹配
	!~ 正則匹配(取反)
	== 等於
3、邏輯表示式
	&& 與
	|| 或
	! 非
4、算數表示式
	+ 加
	- 減
	* 乘
	/ 除
	% 取餘
5、條件表示式
	== / > / < / >= / <=
6、範圍表示式
比如第幾行到第幾行等等

案例

1、列印第三行的第一列和第三列
[root@judyju ~]# awk -F: 'NR=3 {print $1,$3}' /etc/passwd
2、列印第三行到第五行的第一列和第三列
[root@judyju ~]# awk -F: 'NR>=3 && NR<=5 {print $1,$3}' /etc/passwd
3、列印前三行或者大於第八行和第三列
[root@judyju ~]# awk -F: 'NR<=3 || NR>8 {print $3}' /etc/passwd
4、列印所有的nologin結尾的第一列
[root@judyju ~]# awk -F: '/'nologin$'/ {print $1}' /etc/passwd
5、列印/etc/passwd最後一列
[root@judyju ~]# awk -F: '{print $NF}' /etc/passwd
6、把/etc/passwd中的包含root的行打印出來
[root@judyju ~]# awk -F: '/root/ {print $0}' /etc/passwd
7、把/etc/passwd中的以root開頭的行打印出來
[root@judyju ~]# awk -F: '/^root/ {print $0}' /etc/passwd
8、打印出root或者ntp開頭的行的解析器
[root@judyju ~]# awk -F: '/^root|^ntp/ {print $NF}' /etc/passwd
9、輸出/etc/passwd中的所有內容包括行號
[root@judyju ~]# awk -F: '{print NR,$0}' /etc/passwd
10、要求把第7行之後的內容輸出,包括行號
[root@judyju ~]# awk -F: 'NR>7 {print NR,$0}' /etc/passwd
11、由案例10,要求輸出每行的uid增加1 
[root@judyju ~]# awk -F: 'NR>7 {print $3,$3+1}' /etc/passwd
12、要求輸出倒數第三列
[root@judyju ~]# awk -F: '{print $(NF-2)}' /etc/passwd
13、要求不使用-F引數,以:分割,並輸出第3列和第5列
[root@judyju ~]# awk 'BEGIN{FS=":"} {print $3,$5}' /etc/passwd
14、在案例13的情況上,要求輸出內容以+連結
[root@judyju ~]# awk -F: 'BEGIN{OFS="+"} {print $3,$5}' /etc/passwd
15、要求輸出第一列和最後一列,排版整齊
[root@judyju ~]# awk -F: '{printf "%-15s|%-15s\n",$1,$NF}' /etc/passwd
16、列印奇數行
[root@judyju ~]# awk -F: '{if(NR%2==1){print NR,$0}}' /etc/passwd
[root@judyju ~]# awk -F: 'NR%2==1 {print NR,$0}' /etc/passwd
17、要求打印出偶數行中包含bash的行
[root@judyju ~]# awk -F: '/bash/ && NR%2==0 { print $0}' /etc/passwd
[root@judyju ~]# awk -F: '/bash/{if(NR%2==0) { print $0}}' /etc/passwd
18、要求在奇數行前輸出奇數,在偶數行前輸出偶數
[root@judyju ~]# awk -F: '{if(NR%2==1){printf "奇數行:%s\n",$0}else{printf"偶數行:%s\n",$0}}' /etc/passwd
19、在前7行前加7,在前14行前加14
[root@judyju ~]# awk -F: '{if(NR<=7){printf "7%s\n",$0}else if(NR<=14){printf "14%s\n",$0}else{print $0}}' /etc/passwd

九、流程控制

流程控制只存在於迴圈中

1、if判斷
單分支 if(){}
雙分支 if(){}else{}
多分支if(){}else if(){} else{}
-->例題都在上面的案例中

2、for迴圈
for (變數 in 陣列){語句}
for (變數;條件;表示式){語句}
---> for(i="初始值";條件判斷;遊標){}

[root@judyju ~]# awk -F: '{for(i=0;i<=4;i++){print $0}}' /etc/passwd

-->知識儲備:++每次加1 --每次減1

3、while迴圈
while (條件判斷){}

案例

1、把/etc/passwd中的每一行列印三遍
[root@judyju ~]# awk -F: '{i=0;while(i<3){print $0,i++}}' /etc/passwd
2、統計/etc/passwd中每個解析器的使用者數
3、要求把/etc/passwd中的第10行中每列都打印出來
[root@judyju ~]# awk -F: 'NR==10{i=1;while(i<=NF){print $i;i++}}' /etc/passwd