Linux中磁碟管理與三劍客之awk初識
昨日內容回顧
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]
今日內容概要
磁碟管理
# 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 : 查看本機的分區(僅顯示已經掛載的)









三劍客之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)之後 列印---- 再繼續處理後續內容