一.awk語法shell
awk [options] 'commands' files
option
-F 定義字段分隔符,默認的分隔符是連續的空格或製表符
使用option中的-F參數定義間隔符號
用$1,$2,$3等的順序表示files中每行以間隔符號分隔的各列不一樣域
NF變量表示當前記錄的字段數
-v 定義變量並賦值 也能夠借用次方式從shell變量中引入bash
二.變量spa
變量命名規則字符串
以字母或下劃線開頭,剩下的部分能夠是:字母、數字、下劃線.cmd
最好遵循下述規範:io
1.以字母開頭
2.使用中劃線或者下劃線作單詞的鏈接
3.同類型的用數字區分
4.對於文件最好加上拓展名awk
NR 表示AWK讀入的行數
FNR表示讀入行所在文件中的行數
# awk '{print NR,FNR,$1}' file1 file2
1 1 aaaaa
2 2 bbbbb
3 3 ccccc
4 1 dddddd
5 2 eeeeee
6 3 ffffff
#
邏輯運算 可直接引用域進行運算
== >= <= != > < ~ !~
# awk 'NR==1 {print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
#
命令 {print $0}
讀後處理 END {awk_cmd1;awk_cmd2;}變量
NR 當前記錄的個數(所有文件鏈接後的統計)
FNR 當前記錄的個數(僅爲當前文件的統計,非所有)
FS 字段分隔符 默認爲連續空格或製表符,能夠使用多個不一樣的符號作分隔符 -F[:/]
OFS 輸出字符的分隔符 默認是空格
# awk -F: 'OFS="=====" {print $1,$2}' /etc/passwd
root=====x
NF 當前讀入行的字段個數
ORS 輸出記錄分隔符 默認是換行
# awk -F: 'ORS="=====" {print $1,$2}' /etc/passwd
root x=====bin x=====
FILENAME 當前文件名file
引用shell變量的方法語法
# a=root
# awk -v var=$a -F: '$1 == var {print $0}' /etc/passwd
或者 把整個命令拆開傳遞,讓shell變量外露,
# awk -F: '$1 == "'$a'" {print $0}' /etc/passwd
# a=NF
# awk -F: '{print $'$a'}' /etc/passwd
三.操做符
賦值
= += -= /= *=
邏輯與 邏輯或 邏輯非
&& || !
匹配正則或不匹配,正則須要用 /正則/ 包圍住
~ !~
關係 比較字符串時要把字符串用雙引號引發來
< <= > >= != ==
字段引用
$ 字段引用須要加$,而變量引用直接用變量名取
運算符
+ - * / % ++ --
轉義序列
\\ \自身
\$ 轉義$
\t 製表符
\b 退格符
\r 回車符
\n 換行符
\c 取消換行
四.if (條件) 動做
如有多個動做,則要用大括號將動做體包含起來 if (條件) {動做1;動做2}
# awk -F: '{if ($1 == "root") print $1}' /etc/passwd
root
#
# awk -F: '{if ($1 == "root") {print $1;print $6}}' /etc/passwd
root
/root
#
if (條件1)
動做1
else
動做2
# awk -F: '{if ($1 == "root"){print $1}else print $6}' /etc/passwd
# awk -F: '{if ($1 == "root") print $1;else print $6}' /etc/passwd
上面兩個命令是等價的,要麼用分號隔開,表示第一個動做體的結束,要麼將動做體用大括號定位範圍
if (條件 1)
動做1
else if(條件 2)
動做2
else if(條件 3)
動做3
else
動做4
# awk -F: '{if ($1 == "root") print $1;else if ($1 == "seker") print $6;else if ($1 == "zorro") print $7;else print NR}' /etc/passwd
root
2
3
...
33
/home/seker
/bin/bash
36
條件 ? 動做1 : 動做2
expr?action1:action2
# awk -F: 'var=($3 >= 500)?$1:"system_user" {print $1"\t"$3"\t"var}' /etc/passwd
# awk -F: '{print ($3>500?$1:$2)}' /etc/passwd