------ awk:報表生成器,格式化文本輸出
gawk:模式掃描和處理語言
基本用法:
awk [options] 'program' var=value file…
awk [options] -f programfile var=value file…
awk [options] 'BEGIN{action;… }pattern{action;… }END{action;… }' file ...
awk 程序可由:BEGIN語句塊、能夠使用模式匹配的通用語句塊、END語句
塊,共3部分組成
program 通常是被放在單引號中
選項:
-F “分隔符” 指明輸入時用到的字段分隔符
-v var=value 變量賦值
awk語言
基本格式:awk [options] 'program' file…
Program:pattern{action statements;..}
pattern和action
• pattern部分決定動作語句何時觸發及觸發事件
BEGIN,END
• action statements對數據進行處理,放在{}內指明
print, printf
分割符、域和記錄
• awk執行時,由分隔符分隔的字段(域)標記$1,$2...$n稱為域標識。$0
為所有域,注意:此時和shell中變量$符含義不同
• 文件的每一行稱為記錄
• 省略action,則默認執行 print $0 的操作
awk工作原理
第一步:執行BEGIN{action;… }語句塊中的語句
打印表頭
第二步:從文件或標准輸入(stdin)
(支持管道)讀取一行,然后執行pattern{ action;… }語句塊,
它逐行掃描文件,從第一行到最后一行重復這個過程,直到文件全部被讀取完畢。
第三步:當讀至輸入流末尾時,執行END{action;…}語句塊
BEGIN語句塊在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,
比如變量初始化、打印輸出表格的表頭等語句通常可以寫在BEGIN語句塊中
END語句塊在awk從輸入流中讀取完所有的行之后即被執行,比如打印所有行的
分析結果這類信息匯總都是在END語句塊中完成,它也是一個可選語句塊
(統計)
pattern語句塊中的通用命令是最重要的部分,也是可選的。如果沒有提供
pattern語句塊,則默認執行{ print },即打印每一個讀取到的行,awk讀取的每
一行都會執行該語句塊

awk變量
變量:內置和自定義變量
FS:輸入字段分隔符,默認為空白字符 awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd awk –F: '{print $1,$3,$7}’ /etc/passwd
OFS:輸出字段分隔符,默認為空白字符 awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd
RS:輸入記錄分隔符,指定輸入時的換行符 awk -v RS=' ' ‘{print }’ /etc/passwd
ORS:輸出記錄分隔符,輸出時用指定符號代替換行符 awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd
NF:字段數量 awk -F:‘{print NF}’ /etc/fstab 引用變量時,變量前不需加$ awk -F:‘{print $(NF-1)}' /etc/passwd
NR:記錄號
awk ‘{print NR}’ /etc/fstab ; awk END‘{print NR}’ /etc/fstab

下次引用變量
引用第一行shell 變量
取出使用率
printf命令
格式化輸出:printf “FORMAT”, item1, item2, ...
(1) 必須指定FORMAT
(2) 不會自動換行,需要顯式給出換行控制符,\n
(3) FORMAT中需要分別為后面每個item指定格式符
格式符:與item一一對應
%c:顯示字符的ASCII碼
%d, %i:顯示十進制整數
%e, %E:顯示科學計數法數值
%f:顯示為浮點數
%g, %G:以科學計數法或浮點形式顯示數值
%s:顯示字符串
%u:無符號整數
%%:顯示%自身
修飾符
#[.#] 第一個數字控制顯示的寬度;第二個#表示小數點后精度,%3.1f
- 左對齊(默認右對齊) %-15s
+ 顯示數值的正負符號 %+d
++i (i=i+1)
哪個在前先算哪個
操作符
算術操作符:
x+y, x-y, x*y, x/y, x^y, x%y
- x:轉換為負數
+x:將字符串轉換為數值
字符串操作符:沒有符號的操作符,字符串連接
賦值操作符:
=, +=, -=, *=, /=, %=, ^=,++, --
下面兩語句有何不同
• awk ‘BEGIN{i=0;print ++i,i}’
• awk ‘BEGIN{i=0;print i++,i}’操作符
比較操作符:
==, !=, >, >=, <, <=
模式匹配符:

~:左邊是否和右邊匹配,包含
print格式:print item1, item2, ...
省略item,相當於print $0

!~:是否不匹配
示例:
awk -F: '$0 ~ /root/{print $1}‘ /etc/passwd
awk '$0~“^root"' /etc/passwd
awk '$0 !~ /root/‘ /etc/passwd
awk -F: ‘$3==0’ /etc/passwd操作符
邏輯操作符:與&&(
與運算,注意不是
短路與),或||,非!
示例:

• awk -F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd
• awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd
• awk -F: ‘!($3==0) {print $1}' /etc/passwd
• awk -F: ‘!($3>=500) {print $3}’ /etc/passwd
條件表達式(三目表達式)
selector?if-true-expression:if-false-expression
• 示例:
awk -F: '{$3>=1000?usertype="Common User":usertype="
SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwdawk PATTERN
PATTERN:根據pattern條件,過濾匹配的行,再做處理
(1)如果未指定:空模式,匹配每一行
(2) /regular expression/:僅處理能夠模式匹配到的行,需要用/ /括起來
awk '/^UUID/{print $1}' /etc/fstab
awk '!/^UUID/{print $1}' /etc/fstab

/需要轉義


兩種寫法
過濾掉以空白符以及#開頭的行
(3) relational expression: 關系表達式,結果為“真”才會被處理
真:結果為非0值,非空字符串
假:結果為空字符串或0值
非0 或空字符取反為1為假
取反
變量
awk PATTERN
4) line ranges:行范圍
startline,endline:/pat1/,/pat2/ 不支持直接給出數字格式

\>單詞右側錨定
awk -F: ‘/^root\>/,/^nobody\>/{print $1}' /etc/passwd
awk -F: ‘(NR>=10&&NR<=20){print NR,$1}' /etc/passwd 顯示行號

(5) BEGIN/END模式
BEGIN{}:僅在開始處理文件中的文本之前執行一次
END{}:僅在文本處理完成之后執行一次
i變量未賦值為空
awk控制語句if-else
語法:if(condition){statement;…}[else statement]
if(condition1){statement1}else if(condition2){statement2}else{statement3}
使用場景:對awk取得的整行或某個字段做條件判斷
打印奇數行
awk控制語句
while循環
語法:while(condition){statement;…}
條件“真”,進入循環;條件“假”,退出循環
使用場景:
行自動循環 針對於列
對一行內的多個字段逐一類似處理時使用
對數組中的各元素逐一處理時使用
time 統計時間
awk 運算效率最高
break和continue
awk ‘BEGIN{sum=0;for(i=1;i<=100;i++)
{if(i%2==0)continue;sum+=i}print sum}'
awk ‘BEGIN{sum=0;for(i=1;i<=100;i++)
{if(i==66)break;sum+=i}print sum}'
break 循環停止
next:
提前結束對本行處理而直接進入下一行處理(awk自身循環)
awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
awk數組
關聯數組:array[index-expression]
不需聲明 直接賦值
index-expression:
• (1)
可使用任意字符串;字符串要使用雙引號括起來
• (2) 如果某數組元素事先不存在,在引用時,awk會自動創建此元素,並將其值 初始化為“空串”
• (3) 若要判斷數組中是否存在某元素,要使用“index in array”格式進行遍歷
數值處理:
rand():返回0和1之間一個隨機數
awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }'
awk函數
自定義函數格式:
function name ( parameter, parameter, ... ) {
statements
return expression
}
示例:
示例:
cat fun.awk
function max(x,y) {
x>y?var=x:var=y
return var
}
BEGIN{a=3;b=2;print max(a,b)}
awk -f fun.awk