一. 命令awk簡介html
1. awk是一種編程語言,用於對文本和數據進行處理的shell
2. 具備強大的文本格式化能力express
3. 利用命令awk,能夠將一些文本整理成爲咱們想要的樣子編程
4. 命令awk是逐行進行處理的數組
二. grep、sed、awk的簡單比較bash
1. 命令grep,更適合單純的查找或匹配文本app
2. 命令sed,更適合對匹配到的文本進行編輯編程語言
3. 命令awk,更適合文本格式化,對文本進行較複雜的格式處理函數
一、awk 中預先定義好的,內置在 awk 內部的變量。
ui
變量名 描述
FS 輸入字段分隔符,默認是空格
OFS 輸出字段分隔符,默認是空格
RS 輸入記錄分隔符,默認換行符
ORS 輸出記錄分隔符,默認換行符
NF number of fields,當前記錄中域的個數,也就是每行有多少列
NR number of rows,已經讀出的記錄數,也就是行號。從1開始,有多個文件時,這個值會累加
FNR 各個文件分別計數的行號
FILENAME 當前文件名
AGRC 命令行參數的個數
ARGV 數組,保存命令行所傳的各個參數複製代碼
4、記錄
複製代碼
# 輸出 test.txt 文件中的全部記錄
awk '{print $0}' test.txt 複製代碼
# 輸出 test.txt 中的全部記錄,並在記錄前顯示行號
awk '{print NR, $0}' test.txt複製代碼
5、域
# 打印第一和第三個以空格分開的列(域)
awk '{print $1, $3}' test.txt複製代碼
6、awk語法格式
awk [options] 'pattern{action}' file複製代碼
# $3 == 0:是 pattern
# print $0:是 action
awk '$3==0 {print $0}' employee # 若是第三個域等於 0,則將這行打印 複製代碼
{print $0}
(打印整行)。awk '$3 == 0' employee 複製代碼
#將結果重定向到文件
awk '$3 == 0' employee > other.txt複製代碼
7、域分隔符
# 指定 : 做爲分隔符
awk -F: '{print $1, $3}' test.txt
# 顯示指定空格做爲分隔符
awk -F'[ ]' '{print $1, $3}' test.txt
# 指定空格、冒號、tab 做爲分隔符
awk -F'[:\t ]' '{print $1, $3}' test.txt
# 指定以逗號(,)做爲分隔符
awk -F, '{print $1, $2}' separator.txt
# 使用 -v 選項對內建變量設置分隔符,和 awk -F, 效果同樣
awk -v FS=',' '{print $1, $2}' separator.txt複製代碼
# 對內建變量 OFS 賦值
awk -v OFS="->" '{print $1, $2, $3}' other.txt複製代碼
輸出如: Beth->4.00->0 Dan->3.75->0
# 同時指定輸入和輸出分隔符
awk -v FS=',' -v OFS='->' '{print $1, $2}' separator.txt複製代碼
8、模式-Pattern
1.根據前面的一些例子,awk 的語法以下
awk [options] 'Pattern {Action}' file1 file2
options(選項): 如前面使用過的 -v -F
Action(動做):如 print 複製代碼
2.Pattern:也就是條件,一個關係表達式,awk 會逐行處理文本,處理完當前行,而後再 處理下一行。若是不指定任何的「條件」,awk 會一行一行的處理完文件的每一行,若是 指定了「條件」,只處理知足條件的行。這即 awk 中的模式。
# 將有四列的行打印出來
awk 'NF == 4 {print $0}' column.txt
# 沒有指定模式則是空模式,空模式會匹配文本中每一行,每一行都知足條件
awk '{print $0}' test.txt複製代碼
# 將包含 in 的記錄行進行打印
awk '/in/ {print $0}' pattern.txt複製代碼
# 從第一行 到 正則匹配到的第一行 之間的全部行進行打印
awk 'NR == 1, /in/{print $0}' pattern.txt
# /xx/ 沒有匹配到第二個模式,打印第一個模式出現的行到文本末尾
awk 'NR == 1, /xx/{print NR, $0}' pattern.txt複製代碼
結果 # 將第一行 到 正則匹配到的第一行中的 in 替換爲 on(從記錄行的左邊開始,只替換一次)
# 怎麼理解這個 1 呢?
# 這裏有兩個模式,awk 讀出每行記錄都會通過這兩個模式的判斷
# 1 表示這個模式爲真,沒有指定模式默認的 action 就是打印整行
awk 'NR == 1,/in/{sub(/in/, "on")} 1' pattern.txt複製代碼
結果9、awk 內建函數
sub (regular expression, substitution string):
sub (regular expression, substitution string, target string)複製代碼
# 將每行第一次出現的域 hello 替換爲 hi,每行只會匹配替換一次
awk '{sub(/hello/, "hi"); print}' test.txt
# 對每行的第一個域進行替換
awk '{sub(/hello/, "hi", $1); print}' test.txt複製代碼
參考: