linux三劍客awk教你如何裁剪結果集

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第6天,點選檢視活動詳情

awk

  • awk在Linux中我們稱之為輸出。在Linux的終端上所有的東西我們都可以用awk來輸出賦值。

image-20220601190434331.png

  • 首先我們要知道終端的所有內容都可以簡化為上圖的二維結構。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表示取出整行資料 |

image-20220602094325052.png

  • 上面是獲取某個結果集的指定幾列並且按照自己的規格輸出。

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

「其他文章」