#cat password
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
root:x:0:0:root:/root:/bin/bash
#awk '/root/{count++;}{print "root was found "count" times"}' /mnt/passwd
root was found 1 times
root was found 1 times
root was found 2 times
root was found 2 times
root was found 3 times
root was found 3 times
root was found 4 times
# awk '/root/{count++;}END{print "root was found "count" times"}' /mnt/passwd
root was found 4 times
===========================
BEGIN模塊後緊跟着動作塊,這個動作塊在awk處理任何輸入文件之前執行。所以它可以在沒有任何輸入的情況下進行測試。它通常用來改變內建變量的值,如OFS,RS和FS等,以及打印標題。如:$ awk‘BEGIN{FS=”:”; OFS=”\t”; ORS=”\n\n”}{print $1,$2,$3} test。上式表示,在處理輸入文件以前,域分隔符(FS)被設爲冒號,輸出文件分隔符(OFS)被設置爲製表符,輸出記錄分隔符(ORS)被設置爲兩個換行符。$ awk ‘BEGIN{print “TITLE TEST”}只打印標題.
END不匹配任何的輸入文件,但是執行動作塊中的所有動作,它在整個輸入文件處理完成後被執行。如$ awk ‘END{print “The number of records is” NR}’ test,上式將打印所有被處理的記錄數。
如何把一行豎排的數據轉換成橫排?
awk ‘{printf(“%s,”,$1)}’ filename
awk ‘BEGIN {FS=”:”;OFS=”:”} gsub(/root/,”hwl”,$1) {print $0}’ passwd 作用於域t awk ‘BEGIN {FS=”:”;OFS=”:”} gsub(/root/,”hwl”) {print $0}’ passwd 作用於全部域 awk ‘BEGIN {FS=”:”;OFS=”:”} sub(/root/,”hwl”,$6) {print $0}’ passwd 將t中第一次出現的r替換爲s
=================================
在Unix awk中兩個特別的表達式,BEGIN和END,這兩者都可用於pattern中(參考前面的awk語法),提供BEGIN和END的作用是給程序賦予初始狀態和在程序結束之後執行一些掃尾的工作。
任何在BEGIN之後列出的操作(在{}內)將在Unix awk開始掃描輸入之前執行,而END之後列出的操作將在掃描完全部的輸入之後執行。因此,通常使用BEGIN來顯示變量和預置(初始化)變量,使用END來輸出最終結果。
例:累計銷售文件xs中的銷售金額(假設銷售金額在記錄的第三字段):
cat sx
一:50件:200.00
二:60件:300.00
三:70件:400.00
$awk 'BEGIN { FS=":";print "統計銷售金額";total=0} {print $3;total=total+$3;} END {printf "銷售金額總計:%.2f",total}' sx
統計銷售金額
200.00
300.00
400.00
銷售金額總計:900.00
(注:>是shell提供的第二提示符,如要在shell程序Unix awk語句和Unix awk語言中換行,則需在行尾加反斜槓)
在這裏,BEGIN預置了內部變量FS(字段分隔符)和自定義變量total,同時在掃描之前顯示出輸出行頭。而END則在掃描完成後打印出總合計。
# awk 'BEGIN { FS=":";print "統計銷售金額";total=0} {print $3;total=total+$3;}{printf "銷售金額總計:%.2f",total}' sx
統計銷售金額
200.00
銷售金額總計:200.00300.00 //200+0 300
銷售金額總計:500.00400.00 //200+300 400
銷售金額總計:900.00 //500+400
================================
包含BEGIN模式和END模式的腳本awkscript:
#!/usr/bin/awk -f -f參數告訴awk將該文件作爲awk的程序文件,然後即可運行該程序。 # awk script using pipes -- awkscript #1- 第一部分BEGIN會先執行,在輸入文件之前執行 BEGIN{ printf " %-22s%s ", "NAME", "DISTRICT" print "--------------------------------------" } #-1 #2- 第二部分 awk腳本正文,要對來自輸入文件datafile的每一行都要執行一遍 /west/{count++} {printf "%s %s %-15s ", $3, $4, $1| "sort +1" } #-2 #3- 第三部分 輸入文件關閉後awk退出之前執行 END{ close "sort +1" printf "The number of sales persons in the western " printf "region is " count "." }
=================
awk 'BEGIN { OFS="%"}{print $1,$2}' file 通過設置輸出分隔符(OFS="%")修改輸出格式。