linux三劍客awk教你如何裁剪結果集
持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第6天,點選檢視活動詳情
awk
- awk在Linux中我們稱之為輸出。在Linux的終端上所有的東西我們都可以用awk來輸出賦值。
- 首先我們要知道終端的所有內容都可以簡化為上圖的二維結構。awk既然是輸出那就需要一個座標及跨度才能確定輸出的內容
- 輸出其實包含兩個一次,一個是獲取一個是返回。我們往往關注的重點是返回的結果集。但是兩者是缺一不可
awk內建變數
- 在瞭解變數之前我們得先了解下awk的基本單元。
| 變數 | 解釋 | 說明 | | -- | -------- | -------- | | 行 | 記錄Record | 通過回車判定行 | | 列 | 欄位Field | 預設通過空格分割 |
| 引數 | 解釋 | | --- | --------------------- | | - F | 指定分割字串 | | -v | 定義或修改awk內建變數 ; 內建變數如下 | | -f | 讀取檔案內awk命令 |
- 好了有了這兩個關鍵名詞之後我們再來看awk為我們內建的物件就簡單很多了。
| 變數 | 功能 |
| -------- | --------------------------------------------------------------------- |
| NR | 記錄的行號; Number Of Row ==NR |
| FNR | awk [引數] [動作] file1 file2 ;此時動作中使用FNR顯示行號會顯示各個檔案的行號,如果NR則會兩個檔案彙總後顯示行號 |
| NF | 記錄的列號: Number of Field == NF |
| FS | 列分割符 : File Separator = FS |
| OFS | 輸出欄位分割符: OUT FILE SEPERATOR = OFS |
| RS | 行分隔符;即是換行符;比如我們行空格匹配換行。awk -v RS=" " '{print $1}' demo.txt
|
| ORS | 指定輸出換行符 |
| FILENAME | 當前檔名 |
| ARGC | 命令列引數個數 |
| ARGV | 陣列: 儲存的是命令列鎖指定的各引數名 |
獲取資料
| awk | | | ------------ | --------------------- | | NR==1 | 取出第一行 | | NR>=1&&NR<=5 | 取出一到五行範圍 | | /tom/ | 顯示tom匹配的行 | | /tom/,/jack/ | 匹配現實從lcf 到jack之間的內容 | | 符號 | > < >= <= == != | | -F | 每一列結束標記 | | {print $num} | 獲取某列值 , num=0表示取出整行資料 |
- 上面是獲取某個結果集的指定幾列並且按照自己的規格輸出。
username password fav age
zhangsan 123 ball 13
lisi 123 swim 15
wangwu 1w3 eat 82
- 針對上面的文字我們來實現上述的幾個操作
查詢fav列包含2的資料
cat demo.txt | awk -F "[ ]+" '$2~/.*2.*/'
查詢fav列包含2的指定列資料
cat demo.txt | awk -F "[ ]+" '$2~/.*2.*/{print $1,$2,$NF}'
查詢zhangsan到lisi之間資料的最後一列
cat demo.txt | awk -F "[ ]+" '/zhangsan/ , /lisi/{print $NF}'
查詢2,3行資料
awk 'NR==2{print $0}NR==3{print $0}' demo.txt
獲取最後一行資料
cat demo.txt | awk 'END{print $0}'
統計
- awk 我們上面二維的方式輸出內容。但是有時候我們想統計文字內容。比如統計關鍵詞出現的次數啦。計算文字內容啦等等需求。這個時候awk為我們提供了兩個特別的模式。BEGIN。END
| 模式 | 含義 | 應用場景 | | ------- | ----------------- | --------------------------------------------- | | BEGIN{} | 裡面的內容會在awk讀取檔案前執行 | 1.進行簡單統計計算不涉及讀取檔案 2.用來處理檔案之前寫個表頭 | | END{} | 裡面的內容會在awk讀取檔案後執行 | 1.awk進行統計,一般統計:先計算,最後END輸出結果 2.awk使用陣列,用來輸出結果 |
| 功能 | shell | awk |
| ---- | ---------------------------------------------------------- | ----------------------------------------------- |
| 陣列 | array[0]=tom | array[0]=tom |
| 列印陣列 | echo $array[0] | printf array[0] |
| 迴圈 | for i in ${array[*]} do echo $i done
(shell中迴圈獲取的是陣列中元素) | for(i in array) print array[i]
(awk中獲取的是元素下標) |
| 判斷 | if [ "tom" -eq 18 ];then echo good fi
| if($NF>18) print "good" else print "bad"
|
- if往往會單獨使用。for往往是結合BEGIN。END使用的。假如現在我們要統計下上述文字123出現的概率
cat demo.txt | awk '{for(i=1;i<=NF;i++) if($i=="123") a++} END{print a}'
下期介紹sed
- 避免回表,引入索引下推|提高索引命中率 | 提前下班啦
- TDengine 時序性資料庫為什麼海量資料下不卡頓呢
- 神奇的XPath,快速完成前端及XML的元素定位,茫茫大海不迷路
- springboot通用分支處理---還在硬編碼特殊處理邏輯?超級管理員不應該被區別對待
- Spring事務太強大了,相容資料庫同時給我們提供多種組合應對業務需求
- java物件在記憶體中如何分佈 | java上鎖原來就是記憶體佔位,so easy
- linux三劍客之編輯器sed出廠
- linux三劍客awk教你如何裁剪結果集
- 執行緒池7個引數拿捏死死的,完爆面試官
- 執行緒池存在的意義
- 多年程式設計師總結下來的懶人必備指令碼之進度條⚠️製作
- java中的static關鍵字說清楚還得靠JVM
- 設計模式存在哪些關聯關係,六種關係傻傻分不清--- UML圖示詳解
- 每次需求評審產品總是讓我提高程式碼複用,說白了就是合成複用原則
- 越級上報不可行,各司其職才是王道---迪米特法則
- 偏向鎖/輕量鎖/重級鎖鎖鎖更健康,上鎖解鎖到底是怎麼完成實現的,我來告訴你
- 狸貓換太子里氏替換原則;不要一味的進行抽象否則最後你無法hold你的物件
- 設計模式是我擺脫碼畜的唯一出路---依賴倒轉原則
- 學好數理化,寫遍所有程式碼都不怕,我用數學分類討論的思想解決
- synchronized已經不在臃腫了,放下對他的成見之初識輕量級鎖