gawk:pattern scanning and processing language
語法:gawk [options] 'program' FILE ...
program:PATTREN{ACTION STATEMENTS}
選項:
-F :指明輸入數據時的字段分隔符
-v var=value:自定義變量
1、print
print item1,item2,...
要點:(1) 逗號分隔符
(2) 輸出的各item可以是字符串,數值,字段(使用&引用),變量(直接輸入變量即可)或者awk表達式
(3) 如果省略item,相當於print $0
2、變量
內置變量
FS:input field seperator輸入時的分隔符:默認爲空白字符
OFS:onput field seperator輸出時的分隔符:默認爲空白字符
RS:input record seperator:輸入時的換行符
ORS:output record seperator:輸出時的換行符
NF:number of field :每一行字段數量
NR:number of recor :行數
FNR:各文件分別計數:行數
FILENAME:當前文件名
ARGC:命令行參數的個數 (命令前使用BEGIN只顯示一次)
ARGV:數組ARGV[#]:保存的是命令行中所給定的各參數
自定義變量
(1)-v var=value 區分大小寫
(2) 在program中直接定義
awk '{test="1";print test}' filename
若不對文件做處理:awk 'BEGIN{test="1";print test}'
3、printf命令
格式化輸出:printf FORMAT(格式符),item1,item2,...
(1) FORMAT 必須給出
(2) 不會自動換行,需要顯示給出換行控制符 \n
(3) FORMAT需要分別爲後面的每個item指定一個格式化符號
格式符:
%c :顯示字符的ASCII碼
%d,%i:顯示十進制整數
%e,%E:科學計數法數值顯示
%f:浮點數
%g,%G:科學計數法或浮點數
%s:字符串
%u:無符號整數
%%:顯示%自身
修飾符:
#[.#]:第一個數字控制顯示的寬度,第二個顯示小數點後的精度(%3.1f)
-:左對齊,默認右對齊
+:顯示數值的符號(正負)
4、操作符
算數操作符
雙目:+-*/ ^ %
單目:-x +x
字符串操作符:沒有符號的操作符,字符串連接
賦值操作符: = += -= *= ...
比較操作符: > >= < <= != ==
模式匹配符:~ 匹配
!~ 不匹配
邏輯操作符:&& || !
函數調用:function_name(argu1,argu2,...)
條件表達式:select?if-true-expression:if-false-expression
5、pattern
(1) empty:空模式,匹配每一行
(2) /regular expression/:正則表達式,僅處理匹配行
(3) 條件表達式/關係表達式:結果有“真”“假”,處理結果爲“真”的行
真:結果爲非0值,非空字符串
(4) line ranges:行範圍
startline,endline:/pat1/,/pat2/由模式匹配指出範圍
不支持直接給出數字的格式
awk -F:'(NR>=2&&NR<=10){print $1}' /etc/passwd
(5) BEGIN/END模式
BEGIN{} :僅在開始處理文件中文本之前執行一次的程序
END{}:僅在文本處理完成之後執行一次
6、常用action
(1) expressions
(2) control statements:if,while等
(3) compound statements:組合語句:
(4) input statements
(5) output statements
7、控制語句
if(condition) {statements} else {statements}
while(conditon) {statements}
do {statements} while(conditon)
for(expr1;2;3) {statements}
break
continue
delete array[index]
delete array
exit
{ statements }
示例:
1、-F:指明輸入數據時的字段分隔符,默認爲空白字符。示例爲使用“:”爲分隔符,並輸出第一組元素:
[root@localhost ~]# tail -n 5 /etc/passwd | gawk '{print $1}' pulse:x:497:496:PulseAudio sshd:x:74:74:Privilege-separated tcpdump:x:72:72::/:/sbin/nologin armo:x:500:500:CentOS named:x:25:25:Named:/var/named:/sbin/nologin [root@localhost ~]# tail -n 5 /etc/passwd | gawk -F: '{print $1}' pulse sshd tcpdump armo named
2、-v var=value與BEGIN共同使用:單獨使用BEGIN不處理文本,只做輸出動作,結合自定義變量的使用:(可使用選項定義,也在直接在program中定義變量)
[root@localhost ~]# awk -v test=armo 'BEGIN{print test}' armo [root@localhost ~]# awk 'BEGIN{test="armo";print test}' armo
3、內置變量的使用:NR:顯示行號
[root@localhost ~]# tail -n 5 /etc/passwd | awk -F: '{print NR,$1,$2 }' 1 pulse x 2 sshd x 3 tcpdump x 4 armo x 5 named x [root@localhost ~]#
4、printf的格式化輸出
[root@localhost ~]# awk -F: '{printf ("%s,%s\n",$1,$2)}' /etc/passwd root,x bin,x daemon,x adm,x lp,x ... [root@localhost ~]# awk -F: '{printf ("%15s --%5s\n",$1,$2)}' /etc/passwd root -- x bin -- x daemon -- x adm -- x lp -- x sync -- x shutdown -- x halt -- x mail -- x 第一域字符寬度15,第二域字符寬帶5 [root@localhost ~]# awk -F: '{printf ("%-15s%+5.3f\n",$1,$3)}' /etc/passwd root +0.000 bin +1.000 daemon +2.000 adm +3.000 lp +4.000 sync +5.000 shutdown +6.000 第一域左對齊寬度15輸出,第三域顯示數值正負、寬度5、小數點後精確到三位輸出
4、操作符使用說明示例
[root@localhost ~]# awk -v a=2 -v b=1 'BEGIN{print "sum="a+b }' sum=3 [root@localhost ~]# awk -F: -v a=2 -v b=1 '{$3>=5?SUM=a+b:SUM=a+a;print $1,SUM}' /etc/passwd root 4 bin 4 daemon 4 adm 4 lp 4 sync 3 shutdown 3 halt 3 mail 3 uucp 3
5、pattern示例
[root@localhost ~]# awk -F: '(NR>=2&&NR<=10){print NR,$1}' /etc/passwd 2 bin 3 daemon 4 adm 5 lp 6 sync 7 shutdown 8 halt 9 mail 10 uucp [root@localhost ~]#