awk

#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="%")修改輸出格式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章