awk 是處理文本的工具,Mac 自帶這個程序。
適合文本比較復(fù)雜的格式化數(shù)據(jù)。
基本語法
awk [可選參數(shù)] [模式-動作] 文件名
awk 會一行一行的處理文件里面的內(nèi)容。
可選參數(shù)說明:
-
-F指定分隔符, 默認(rèn)是以空格作為分隔符; -
-f從腳本文件中讀取 awk 命令;
可選參數(shù)可以省略。
模式-動作 說明:
其中模式可以有 0 個或者多個,每一行的內(nèi)容會依次測試每個模式,所有的模式都匹配之后,會執(zhí)行相應(yīng)的動作。
每個模式或者動作里面可以使用 awk 中的 運算符, 內(nèi)置變量, 內(nèi)置函數(shù)等。
假設(shè)有一個 emp.data 文件, 里面內(nèi)容是部分 NBA 球員的姓名,身高, 年齡的數(shù)據(jù):
Stephen Curry, 1.91, 31
Kevin Durant, 2.06, 30
LeBron James, 2.03, 34
Russell Westbrook, 1.92, 30
Kyrie Lrving, 1.90, 27
-
沒有模式
輸出每一行的內(nèi)容, 使用如下命令:
awk '{print $0}' emp.data
結(jié)果如下:
Stephen Curry, 1.91, 31
Kevin Durant, 2.06, 30
LeBron James, 2.03, 34
Russell Westbrook, 1.92, 30
Kyrie Lrving, 1.90, 27
輸出第一列的內(nèi)容, 使用如下命令:
awk '{print $1}' emp.data
結(jié)果如下:
Stephen
Kevin
LeBron
Russell
Kyrie
發(fā)現(xiàn)第一列的姓名沒有顯示完全, 因為 awk 默認(rèn)是以空格作為分隔符的,如果需要顯示完全需要我們顯示的指定分隔符。
輸出每個人的名字, 使用如下命令:
awk -F "," '{print $1}' emp.data
結(jié)果如下:
Stephen Curry
Kevin Durant
LeBron James
Russell Westbrook
Kyrie Lrving
輸出每個球員名字的小寫字母, 使用如下命令:
awk -F "," ' {print tolower($1)}' emp.data
結(jié)果如下:
stephen curry
kevin durant
lebron james
russell westbrook
kyrie lrving
-
單個模式
輸出年齡大于30歲的球員的姓名和身高, 使用如下命令:
awk -F "," '$3 > 30 {print $1, $2}' emp.data
結(jié)果如下:
Stephen Curry 1.91
LeBron James 2.03
輸出姓名大于12個字符(含空格)的球員信息, 使用如下命令:
awk -F "," 'length($1) > 12 {print $0}' emp.data
結(jié)果如下:
Stephen Curry, 1.91, 31
Russell Westbrook, 1.92, 30
-
多個模式
輸出年齡大于30歲,并且身高大于2米的球員的信息,使用如下命令:
awk -F "," '$3 > 30 && $2 > 2.00 {print $0}' emp.data
結(jié)果如下:
LeBron James, 2.03, 34
awk 腳本
語法結(jié)構(gòu)如下:
BEGIN {放置的是執(zhí)行前的語句}
{處理每一行時要執(zhí)行的語句}
END {處理完所有的行后要執(zhí)行的語句}
其中 BEGIN 和 END 都是可選的。
統(tǒng)計所有球員的總身高,使用如下命令:
awk -F "," '{sum+=$2} END {print sum}' emp.data
其中 sum 為自定義的變量, $2 為內(nèi)置變量,表示第二列的值。
結(jié)果如下:
9.82
運算符
| 運算符 | 描述 |
|---|---|
| = += -= *= /= %= ^= **= | 賦值 |
| ?: | C條件表達(dá)式 |
| || | 邏輯或 |
| && | 邏輯與 |
| ~ ~! | 匹配正則表達(dá)式和不匹配正則表達(dá)式 |
| < <= > >= != == | 關(guān)系運算符 |
| 空格 | 連接 |
| + - | 加,減 |
| * / % | 乘,除與求余 |
| + - ! | 一元加,減和邏輯非 |
| ^ *** | 求冪 |
| ++ -- | 增加或減少,作為前綴或后綴 |
| $ | 字段引用 |
| in | 數(shù)組成員 |
變量
$ + 數(shù)字 表示某個字段: $1 表示第一個字段, $2 表示第二個字段, $3 表示第三個字段, … , $0 表示一整行。
變量 NF 表示當(dāng)前行有多少個字段。
變量 NR 表示當(dāng)前是第幾行。
其他常用變量:
-
FILENAME:當(dāng)前文件名 -
FS:字段分隔符,默認(rèn)是空格和制表符。 -
RS:行分隔符,用于分割每一行,默認(rèn)是換行符。 -
OFS:輸出字段的分隔符,用于打印時分隔字段,默認(rèn)為空格。 -
ORS:輸出記錄的分隔符,用于打印時分隔記錄,默認(rèn)為換行符。 -
OFMT:數(shù)字輸出的格式,默認(rèn)為%.6g。
函數(shù)
常用的函數(shù)如下:
-
tolower():字符轉(zhuǎn)為小寫。 -
toupper(): 字符串轉(zhuǎn)為大寫。 -
length():返回字符串長度。 -
substr():返回子字符串。 -
sin():正弦。 -
cos():余弦。 -
sqrt():平方根。 -
rand():隨機(jī)數(shù)。
awk 內(nèi)置函數(shù)的完整列表,可以查看手冊。