awk: 又稱gawk,以Aho Kernighan Weinberger 3位作者首字母命名的UNIX平臺上的強大編輯工具.其原理(處理文件時)是依次(循環遍歷一遍)讀取文件的每行,一次讀取一行,按照分隔符(如果文件是有固定格式的)進行切片或其它處理工作.
用法格式: awk [Options] 'Patterns{Actions Statements}' File1 File2 ...
,各段說明如下:
Options:awk命令的選項
-F: 指定對每行處理的分隔符.然后就可以用($0,$1,$2,...)依次取出各列,其中$0指代整行內容.
-v varname: *聲明自定義變量 *
示例-->awk -v word="Hello awk!" 'BEGIN{print word}'
Patterns: 匹配模式
BEGIN/END: 特殊模式,僅在awk命令執行前或執行后運行一次.
expression: 表達式,其值非0或為非空字符時滿足條件,如$1~/foo/ 或 $1=="ShenZhen"
示例-->awk -F: '$3==0,$7~"nologin"BEGIN{print "username:%10s,userid:%5s,usershell:%20s",$1,$3,$7}' /etc/passwd
/RegularExpression/: 正則表達式
示例-->awk -F: '/^/{print $1,$3}' /etc/passwd
Actions: 處理動作
1.print --> '{print $1, $4}'
2.printf:格式化輸出,用法類似C語言里的printf,需要結合各格式化字符才能更加美觀地顯示輸出(不會自動換行)
format格式符 | 作用 |
---|---|
%c | 顯示字符的ASCII碼 |
%d, %i | 十進制 |
%e, %E | 科學計數法顯示數值 |
%f | 顯示浮點數 |
%g, %G | 以科學計數法的格式或浮點數的格式顯示數值. |
%s | 顯示字符串 |
%u | 無符號整數 |
%% | 顯示%自身 |
修飾符 | ----- |
N | 顯示寬度 |
- | 左對齊 |
+ | 顯示數值符號 |
示例--> awk -F: '{printf "%-15s %i\n", $1, $3}' /etc/passwd
Statements: 腳本語句
if (condition) statement [ else statement ]
示例--> awk -F: '{if ($1=="root") print $1, "Admin"; else print $1, "Common User"}' /etc/passwd
while (condition) statement:對每行內容進行循環處理
示例-->awk -F: '{i=1;while(i<=3){print $i;i++}}' /etc/passwd
do statement while (condition)
for (expr1; expr2; expr3) statement
for (var in array) statement
示例-->awk -F: '$NF !~ /^$/{BASH[$NF]++}END{for(A in BASH){printf "%15s:%i\n", A,BASh[A]}}' /etc/passwd
break
continue
delete array[index]
delete array
exit [ expression ]
{ statements }
switch (expression) {
case value|regex : statement
...
[ default: statement ]
}
awk內置變量:
變量名 | 含義 |
---|---|
FS | Field Separator,(輸入)文本文件時所使用的字段分隔符 默認是空白字符 |
OFS | Output Field Separator,輸出分隔符,可以自定義各種.示例--> awk 'BEGIN{OFS="++"}{print $1,$2,$3}' test.txt |
RS | Record Separator,(輸入)文本信息所使用換行符 |
ORS | Output Record Separator,輸出的換行符 |
NR | Num of Record,行數 |
FNR | 用于記錄正處理的行是當前這一文件中被總共處理的行數,而NR記錄的行數是所有處理的文件的 總數. |
NF | Num of Field,當前正在處理的行的列數.示例: awk '{print NF}' a.py # a.py這個文件的各列的列數不確定,所以輸出的數字是不一樣的. |
FILENAME | 當前處理的文件文件名. |
awk的操作符(與其它語言如Python shell等非常類似):
-x: 負值
+x: 轉換為數值
x^y: 與運算
x**y: x的y次方
x[+|-|*|/]y: 加減乘除法
= += -= ...
++ --
x<y x>y x<=y x!=y x==y x~y(x能被y模式所匹配) x!~y
x&&y x||y
selector?if-true-exp:if-false-exp
awk函數: function_name(para1, para2)