標籤:shell指令碼(六)
shell指令碼(六)
(2)awk
a、awk編程模式
#awk編程模式分三個階段:讀取輸入檔案前執行程式碼片段(由BEGIN關鍵詞標識)
#讀取輸入檔案時執行程式碼片段、讀取輸入檔案完畢之後執行程式碼片段(由END關鍵詞標識)
b、模式比對
#awk語句由模式(pattern)和動作組成(action)。
#匹配空白行
awk ‘/^$/{print "a blank line"}‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/47/wKiom1V34ZDBz4-tAABo7J-EHt4758.jpg" />
c、記錄和域
#awk將每個輸入檔案定義為記錄,行中的每個字串定義為域,域之間使用空格、tab
#鍵或其他符號進行分隔,分隔域的符號叫做分隔字元。$為網域作業符,對指定域執行動作
#$1表示第1個域、$2表示第2個域、$3表示第3個域,以此類推,而$0表示所有域
#如檔案num.txt內容,以":"為分隔字元,則會分成4個域:num、123、name1和test1
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/43/wKioL1V34zbhgywvAABw1lNZUTI250.jpg" />
#分隔字元也可以使用BEGIN標識中的FS變數來改變
awk ‘BEGIN { FS=":"} {print $1 "," $2}‘ num.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/47/wKiom1V34ZHjh7AxAABKS_MWNFY545.jpg" />
d、關係和布爾運行符
#關係運行符<、<=、>、>=、==、!=、~、!~:分別為小於、小於等於、大於、大於等於
#等於、不等於、匹配Regex、不匹配Regex
awk ‘BEGIN { FS=":" } { if($3<1) print $1 }‘ /etc/passwd
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/43/wKioL1V34zaQZ04uAABDCIOMP8Q052.jpg" />
#匹配Regex和不匹配Regex
awk ‘BEGIN {FS=":"} $2~/123/‘ num.txt
awk ‘BEGIN {FS=":"} $2!~/123/‘ num.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/47/wKiom1V34ZGip_9DAACgHfjg1bo094.jpg" />
#布林運算子 ||、&&和!:分別為或、與、非
awk ‘BEGIN {FS=":"} {if($2==123 || $4=="test2") print $0}‘ num.txt
awk ‘BEGIN {FS=":"} {if($1=="num" && $2==122) print $0}‘ num.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/47/wKiom1V34ZKDkRnNAACgz3VpY6M072.jpg" />
#算術運算+、-、*、/、%、^或**、++x、x++、--x和x--:分別為加、減、乘、除、求模、
#返回x值前自增1和返回x值之後自增1,返回x值前自減1和返回x值之後自減1
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/43/wKioL1V34zeShUVIAADI4vVOWdk759.jpg" />
awk -F: ‘/num/{print $5+$2}‘ num.txt
awk -F: ‘/num/{print $5-$2}‘ num.txt
awk -F: ‘/num/{print $5*$2}‘ num.txt
awk -F: ‘/num/{print $5/$2}‘ num.txt
awk -F: ‘/num/{print $5%$2}‘ num.txt
awk -F: ‘/num/{print $2^2 }‘ num.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/47/wKiom1V34ZLg10hpAAGGhXd_4wo875.jpg" />
e、系統變數
#$n:目前記錄的第n個域,域間由FS分割
#$0:記錄的所的域
#ARGC:命令列參數的數量
#ARGING:命令列中當前檔案的位置(以0開始標識)
#ARGV:命令列參數的數組
#CONVFMT:數字轉換格式
#ENVIRON環境變數關聯陣列
#ERRNO:最後一個系統錯誤的描述
#FIELDWIDTHS:欄位寬度列表,以空格分隔
#FILENAME:當前檔案名稱
#FNR:瀏覽檔案的記錄數,即檔案中有多少條記錄(行)
#FS:指定域分隔字元,預設為空白格
#IGNORECASE:布爾變數,如果為直,則進行忽略大小寫匹配
#NF:目前記錄中的域數量,即目前記錄,以分隔字元分隔後域的數量
#NR:目前記錄數,即當前讀取到第幾條記錄
#OFMT:數位輸出格式
#OFS:輸出域分隔字元,預設為空白格
#ORS:輸出記錄分隔字元,預設是分行符號
#RLENGTH:由match函數所匹配的字串長度
#RS:記錄分隔字元,預設為空白格
#RSTART:由match函數所匹配的字串的第1個位置
#SUBSEP:數組下標分隔字元,預設值是\034
#以":"為分隔字元,列印目前記錄中的域數量、記錄數、所有域以及檔案名稱和檔案記錄數
awkl ‘BEGIN {FS=":"} {print NF,NR,$0} END {print FILENAME,FNR}‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/43/wKioL1V34zjwxzFOAACFppOQdvU311.jpg" />
f、格式化輸出
#printf (格式化控制符,參數) ,控制符都是以%開始,參數一般為域
#修飾符"-"、"width"和".prec",分別表示:靠左對齊、域的步長和小數點右邊的倍數
#格式符"%c"、"%d"、"%e"、"%f"、"%o"、"%s"和"%x",分別表示:ascii字元、整形數
#浮點數,科學記號標記法、浮點數、八進位、字串和十六進位
#以":"為分隔字元,格式化輸出num.txt的第1域和第4域
awk -F: ‘{printf(%s\t%f\n,$1,$4)}‘ num.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/47/wKiom1V34ZPhoW6yAABNQ4EXclU563.jpg" />
#浮點數長度控制在5位、小數點後保留2位
awk ‘BEGIN {printf("%5.2f\n",20150506.2101)}‘
#小浮點數小數點保留3位,並且靠左對齊
awkl ‘BEGIN {printf("%-.3f\n",20150506.2101)}‘
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/43/wKioL1V34zihT4GRAACGtW-pGEY554.jpg" />
g、內建字串函數
#gsub(r,s):在輸入檔案中用s替換r
#gsub(r,s,t):在t中用s替換r
#index(s,t):返回s中字串第1個t位置
#length(s):返回s長度
#match(s,t):測試s是否包含匹配t的字串
#split(r,s,t):在t上將r分成序列s
#sub(r,s,t):將t中第1次出現的r替換成s
#substr(r,s):返回字串r中從s開始的尾碼部分,即截取從s開始到末尾字串
#substr(r,s,t):返回字串r中從s開始長度為t的尾碼部分,
#即截取從s開始長度為t的字串
#gsub("name","*"):在輸入檔案中用*替換name
awk ‘BEGIN {FS=":"} gsub(/name/,"*") {print $0}‘ num.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/47/wKiom1V34ZOTe9NNAABDq5Uorvo982.jpg" />
#index("get_string_index","string"):返回第1個"string"位置,從1開始
awk ‘BEGIN {print index("get_string_index","string")}‘
#length("get_string_length"):擷取字串長度
awk ‘BEGIN {print length("get_string_length")}‘
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/43/wKioL1V34zjiw097AACHc_VJobA368.jpg" />
#match("test_string_exist","string"):測試字串string是否包含在test_string_exist
awk ‘BEGIN {print match("test_string_exist","string")}‘
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/47/wKiom1V34ZOg4A_bAABVFc4ovtI322.jpg" />
#sub("name2","rep",$0):將$0第1次出現的name2替換成rep
awk ‘BEGIN {FS=":"} $2~122 sub("name2","rep",$0);print $0}‘ num.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/43/wKioL1V34zngu6CrAABeP4Yu0mA719.jpg" />
#substr("get_string_test",5):擷取從5個字元開始到行末字串
#substr("get_string_test",5,6):擷取從5個字元開始長度為6個字元的字串
awk ‘BEGIN {print substr("get_string_test",5)}‘
awk ‘BEGIN {print substr("get_string_test",5,6)}‘
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/47/wKiom1V34ZTzZeg_AACk6eSSXbk000.jpg" />
h、向awk指令碼傳遞參數
i、條件陳述式和迴圈語句
#if條件陳述式。
if (條件運算式)
{
動作
}
else
{
動作
}
#for迴圈語句
for(n=0;n<=10;i++)
{
動作
}
#while迴圈語句,第1個while至少執行1次,
#第2個while可能1次都沒有執行(條件不符合)
do
{
動作
}
while (條件運算式)
while(條件運算式)
{
動作
}
本文出自 “愛就行動” 部落格,請務必保留此出處http://1055745601.blog.51cto.com/5003160/1660417
shell指令碼(六)