awk 是處理文本的工具,Mac 自帶這個程序盅粪。
適合文本比較復雜的格式化數(shù)據(jù)蝇裤。
基本語法
awk [可選參數(shù)] [模式-動作] 文件名
awk 會一行一行的處理文件里面的內(nèi)容。
可選參數(shù)說明:
-
-F
指定分隔符, 默認是以空格作為分隔符; -
-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 默認是以空格作為分隔符的刺彩,如果需要顯示完全需要我們顯示的指定分隔符。
輸出每個人的名字, 使用如下命令:
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條件表達式 |
|| | 邏輯或 |
&& | 邏輯與 |
~ ~! | 匹配正則表達式和不匹配正則表達式 |
< <= > >= != == | 關(guān)系運算符 |
空格 | 連接 |
+ - | 加知押,減 |
* / % | 乘叹螟,除與求余 |
+ - ! | 一元加,減和邏輯非 |
^ *** | 求冪 |
++ -- | 增加或減少台盯,作為前綴或后綴 |
$ | 字段引用 |
in | 數(shù)組成員 |
變量
$ + 數(shù)字
表示某個字段: $1
表示第一個字段罢绽, $2
表示第二個字段, $3
表示第三個字段, … , $0
表示一整行静盅。
變量 NF
表示當前行有多少個字段良价。
變量 NR
表示當前是第幾行。
其他常用變量:
-
FILENAME
:當前文件名 -
FS
:字段分隔符蒿叠,默認是空格和制表符棚壁。 -
RS
:行分隔符,用于分割每一行栈虚,默認是換行符袖外。 -
OFS
:輸出字段的分隔符,用于打印時分隔字段魂务,默認為空格曼验。 -
ORS
:輸出記錄的分隔符,用于打印時分隔記錄粘姜,默認為換行符鬓照。 -
OFMT
:數(shù)字輸出的格式,默認為%.6g
孤紧。
函數(shù)
常用的函數(shù)如下:
-
tolower()
:字符轉(zhuǎn)為小寫豺裆。 -
toupper()
: 字符串轉(zhuǎn)為大寫。 -
length()
:返回字符串長度号显。 -
substr()
:返回子字符串臭猜。 -
sin()
:正弦。 -
cos()
:余弦押蚤。 -
sqrt()
:平方根蔑歌。 -
rand()
:隨機數(shù)。
awk
內(nèi)置函數(shù)的完整列表揽碘,可以查看手冊次屠。