Linux 命令工具之 awk

一、awk 介紹

awk 是一種編程語言,用於在 linux/unix 下對文本和數據進行處理。支持 if 判斷分支和 while 循環語句還有它的內置函數等,是一個要比 grep 和 sed 更強大的文本處理工具。

awk 處理文本和數據的方式:它逐行掃描文件,從第一行到最後一行,尋找匹配的特定模式的行,並在這些行上進行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標準輸出 (屏幕),如果沒有指定模式,則所有被操作所指定的行都被處理。

awk 作爲一種編程語言,作用是做報表,日誌分析等等。

二、awk 命令基礎使用

1. 使用方式

注意: awk 可以使用命令行方式和腳本方式對文本文件進行處理

2. 命令選項

注意

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

三、常用內置變量和運算符以及內置函數

內置變量

zT484e

運算符

PRldM7

內置函數

HSDOpM

編程語句

四、awk 最佳實踐

  1. 基礎使用
# 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
  1. 匹配、計算
# 匹配行內容
## 同理可以支持模糊匹配 '$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
  1. 條件判斷
# 獲取第二列大於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
  1. 複雜計算 (數組 + 迭代)
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