#cat password
mysql
root:x:0:0:root:/root:/bin/bashsql
bin:x:1:1:bin:/bin:/sbin/nologinshell
operator:x:11:0:operator:/root:/sbin/nologinbash
haldaemon:x:68:68:HAL daemon:/:/sbin/nologinide
root:x:0:0:root:/root:/bin/bash測試
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bashspa
root:x:0:0:root:/root:/bin/baship
#awk '/root/{count++;}{print "root was found "count" times"}' /mnt/passwd
root was found 1 timesit
root was found 1 timespip
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="%")修改輸出格式。