shell指令碼(六)

來源:互聯網
上載者:User

標籤: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指令碼(六)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.