天天看點

shell程式設計基礎(awk、sort)

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:用于在讀取兩個或兩個以上的檔案時,判斷是不是在讀取第一個檔案。

shell程式設計基礎(awk、sort)

案列一

使用awk擷取ifconfig中ens33下的ip位址

shell程式設計基礎(awk、sort)

通過grep "netmask"我們篩選出以下這一段,不要急慢慢來~

shell程式設計基礎(awk、sort)

篩選出來現在有三行,我們隻要第一行的IP位址該怎麼操作呢? | head -1

shell程式設計基礎(awk、sort)

好咯,現在隻有一行了,我們可以通過awk擷取ip位址了 192.168.76.147屬于這一行中的第二列使用$2(以空格為列)

最終指令:

#ifconfig | grep "netmask" | head -1 | awk '{print $2}'
           
shell程式設計基礎(awk、sort)

案列二

假設我想知道檔案系統Use大于50%怎麼操作呢?

直接df -h?

nonono

我隻想看Use大于50%怎麼辦呢?

shell程式設計基礎(awk、sort)

因為Use%後面挂着%不好篩選判斷,使用sed把%替換掉

sed使用方法可參考以下部落格

https://blog.csdn.net/weixin_44057684/article/details/104850248

shell程式設計基礎(awk、sort)

然後使用awk,這裡需要用到關系運算符 >

最終指令↓

#df -h | sed 's/%//g' | awk '$5>50{print $0}'
           
shell程式設計基礎(awk、sort)
  1. 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(成績)

shell程式設計基礎(awk、sort)

案列一

現在有這些資料我需要按照分數進行從小到大排序

需要用到 -t截取 -n逆向排序 -k指定列

最終指令為

sort -t " " -nk 2 sort.txt
           
shell程式設計基礎(awk、sort)

案列二

去重 -u

需要用到 -t截取 -n逆向排序 -k指定列

sort -t " " -uk 2 sort.txt
           

這裡為什麼要用 -t -k呢? 預設第全局去查重,-t指定分隔空格" " -k 指定第二列按照分數查重

shell程式設計基礎(awk、sort)

(注:沒有示範純數字的了,會以上操作對于純數字、字元也不難了)

擴充:

面試題

使用Linux指令算出sort.txt檔案中成績一欄的總和

cat sort.txt | awk -F " " ‘{sum+=$2} END {print sum}’ sort.txt

shell程式設計基礎(awk、sort)
上一篇: awk 字段比對
下一篇: awk的妙用

繼續閱讀