awk用法
文法
awk ‘條件1 {動作 1} 條件 2 {動作 2} …’ 檔案名
awk [選項] ‘指令’ 檔案
print 意思就是列印輸出
條件類型 條 件 說 明
awk保留字 BEGIN 在 awk 程式一開始,尚未讀取任何資料之前執行。BEGIN 後的動作隻在程式開始時執行一次
awk保留字 END 在 awk 程式處理完所有資料,即将結束時執行?END 後的動作隻在程式結束時執行一次
關系運算符 :
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于。用于判斷兩個值是否相等。如果是給變童指派,則使用"=”
!= 不等于
A~B 判斷字元串 A 中是否包含能比對 B 表達式的子字元串
A!~B 判斷字元串 A 中是否不包含能比對 B 表達式的子字元串
正規表達式 :
/正則/ 如果在“//”中可以寫入字元,則也可以支援正規表達式
x>10:判斷變量 x 是否大于10;
x == y:判斷變量 x 是否等于變量 y;
A~B:判斷字元串 A 中是否包含能比對 B 表達式的子字元串;
A!~B:判斷字元串 A 中是否不包含能比對 B 表達式的子字元串;
NR:表示awk開始執行程式後所讀取的資料行數。
FNR:awk目前讀取的記錄數,其變量值小于等于NR(比如當讀取第二個檔案時,FNR是從0開始重新計數,而NR不會)。
NR==FNR:用于在讀取兩個或兩個以上的檔案時,判斷是不是在讀取第一個檔案。
案列一
使用awk擷取ifconfig中ens33下的ip位址
通過grep "netmask"我們篩選出以下這一段,不要急慢慢來~
篩選出來現在有三行,我們隻要第一行的IP位址該怎麼操作呢? | head -1
好咯,現在隻有一行了,我們可以通過awk擷取ip位址了 192.168.76.147屬于這一行中的第二列使用$2(以空格為列)
最終指令:
#ifconfig | grep "netmask" | head -1 | awk '{print $2}'
案列二
假設我想知道檔案系統Use大于50%怎麼操作呢?
直接df -h?
nonono
我隻想看Use大于50%怎麼辦呢?
因為Use%後面挂着%不好篩選判斷,使用sed把%替換掉
sed使用方法可參考以下部落格
https://blog.csdn.net/weixin_44057684/article/details/104850248
然後使用awk,這裡需要用到關系運算符 >
最終指令↓
#df -h | sed 's/%//g' | awk '$5>50{print $0}'
-
sort
串聯排序所有指定檔案并将結果寫到标準輸出
排序選項:
-b, --ignore-leading-blanks 忽略前導的空白區域
-d, --dictionary-order 隻考慮空白區域和字母字元
-f, --ignore-case 忽略字母大小寫
-g, --general-numeric-sort 按照正常數值排序
-i, --ignore-nonprinting 隻排序可列印字元
-n, --numeric-sort 根據字元串數值比較
-r, --reverse 逆序輸出排序結果
其他選項:
-c, --check, --check=diagnose-first 檢查輸入是否已排序,若已有序則不進行操作
-k, --key=位置1[,位置2] 在位置1 開始一個key,在位置2 終止(預設為行尾)
-m, --merge 合并已排序的檔案,不再進行排序
-o, --output=檔案 将結果寫入到檔案而非标準輸出
-t, --field-separator=分隔符 使用指定的分隔符代替非空格到空格的轉換
-u, --unique 配合-c,嚴格校驗排序;不配合-c,則隻輸出一次排序結果
基礎文法
sort [選項參數] [檔案]
假設有個學生成績表.有Name(姓名)有Results(成績)
案列一
現在有這些資料我需要按照分數進行從小到大排序
需要用到 -t截取 -n逆向排序 -k指定列
最終指令為
sort -t " " -nk 2 sort.txt
案列二
去重 -u
需要用到 -t截取 -n逆向排序 -k指定列
sort -t " " -uk 2 sort.txt
這裡為什麼要用 -t -k呢? 預設第全局去查重,-t指定分隔空格" " -k 指定第二列按照分數查重
(注:沒有示範純數字的了,會以上操作對于純數字、字元也不難了)
擴充:
面試題
使用Linux指令算出sort.txt檔案中成績一欄的總和
cat sort.txt | awk -F " " ‘{sum+=$2} END {print sum}’ sort.txt