Linux 命令工具之 awk
一、awk 介紹
awk 是一種編程語言
,用於在 linux/unix 下對文本和數據進行處理。支持 if 判斷分支和 while 循環語句還有它的內置函數等,是一個要比 grep 和 sed 更強大的文本處理工具。
awk 處理文本和數據的方式:它逐行掃描文件
,從第一行到最後一行,尋找匹配的特定模式的行,並在這些行上進行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標準輸出 (屏幕),如果沒有指定模式,則所有被操作所指定的行都被處理。
awk 作爲一種編程語言,作用是做報表,日誌分析等等。
二、awk 命令基礎使用
1. 使用方式
-
awk [可選參數] command filename
-
awk [可選參數] -f scirptfile var=value filename
注意: awk 可以使用命令行方式和腳本方式對文本文件進行處理
2. 命令選項
-
-F
: 指定輸入文件處理的分隔符,默認爲空格 -
-v var=value
: 從 shell 腳本傳遞變量到 awk 腳本中 -
-f|--file scriptfile
: 從腳本文件中讀取 awk 命令
注意
awk 腳本內容分爲 BEGIN區、正文區、END區
。其中 BEGIN 區 更多的用於處理數據的頭文件,比如表頭;而 END 區 一般用於處理彙總信息,比如表格的總計信息。
在腳本首行需要指定 解釋器。
$ cat test.awk
#!/usr/bin/awk -f
BEGIN{ print "start..."
FS=":"
}
{ print $1" "$2}
END{ print "end..."}
# 執行awk 腳本
$ awk -f test.awk /etc/passwd
三、常用內置變量和運算符以及內置函數
內置變量
運算符
內置函數
編程語句
-
if: 條件判斷
-
for: 迭代
-
while: 條件判斷
-
exit/break/continue: 循環控制
四、awk 最佳實踐
- 基礎使用
# awk 處理過程中每一行成爲一個記錄,$0 表示整行記錄,NR 表示一個計數器,即讀取到的行數
## 依次讀取test.txt 文件中的每一行並輸出行號和內容
$ awk '{print NR,$0}' test.txt
# 獲取行數 借用awk 按行讀取的特性,每讀一行進行一次自增
$ awk '{line++} END{print line}' /etc/passwd
# 指定分隔符
## 快速獲取Linux系統中的用戶名稱
awk -F ':' '{print $1}' /etc/passwd | head
# 倒數第二列
awk '{print $(NF-1)}' test.txt
# 整個文本最後一列
awk '{print $NF}' test.txt
#遍歷文件的所有單詞
$ awk '{for(i=1;i<=NF;i++) {print $i}}' test.txt
# 打印99乘法表
awk 'BEGIN {for(i=1;i<9;i++) {for(j=1;j<9;j++) {biao[i,j] = i*j;print i,"*",j,"=", biao[i,j];} }}'
# 使用linux shell 命令
## 注意: 等同於 awk 'BEGIN {FS = ":"} {print $1 }' /etc/passwd | sort
awk 'BEGIN {FS = ":"} {print $1 | "sort"}' /etc/passwd
- 匹配、計算
# 匹配行內容
## 同理可以支持模糊匹配 '$0 ~ /(class-1|student-1)/'
awk '$0 ~/class/' filename
# 精準匹配域
## 同時也可以反向匹配 '$7!="class-2" {print $0}'
awk '$7=="class-1" {print $0}' filename
# 匹配列並進行計算
awk '$1 ~ /lg/ {mem = $2 * $3; print mem}' filename
awk '$1 ~ /cls/ {clusterID=$1; print $1" "$2}' filename
# 正則匹配並打印和計算列
awk -F ':' '/^root/{print $0}' /etc/passwd
awk -F ':' '/^root/{print $3+1}' /etc/passwd
- 條件判斷
# 獲取第二列大於60的數據
awk '$2>60 {print $0}' filename
# 獲取第二列大雨第4列的數據
awk '$2 > $4 {print $0}' filename
# 複合表達式
## 獲取第二列大於60且第三列大於60的數據
## 同理或 '{ if ($2 > 80 || $4 > 80) print $0}'
awk '{ if ($2 > 60 && $3 > 60) print $0}' filename
- 複雜計算 (數組 + 迭代)
awk 'BEGIN{str_tmp="it is a test";split(str_tmp,str_arr," ");for(k in str_arr){print k,str_arr[k];}}'
注意
:split 是 awk 內置的函數,split(str_tmp,str_arr," ")
可以將 str_tmp 變量按照空格分割後賦值到 str_arr 的數組變量中。(split 街區的數組下標從 0 開始)
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/OFjy_EIJKCLwF7rwAaeOFw