perl
語言中的AWK之基礎篇一:AWK與perl
- 1. Perl,我們並不陌生了到目前為止,它在web編程中的強大作用,對於每個web開發人員而言,重要性不言而喻,
- 由於perl借取了C、sed、awk、shell scripting以及很多其他程式語言的特性。
- 其中最重要的特性是它內部整合了Regex的功能,以及巨大的第三方程式碼程式庫CPAN。
- 簡而言之,Perl 象C一樣強大,象awk、sed等指令碼描述語言一樣方便,由此看來在perl語言中,AWK佔據著重要的一席之地。
- 這裡我們不去重點的說perl語句而是介紹一下其重要的組成部分AWK的基礎內容,
- 下面我們就來揭開perl中的awk的神秘面紗吧!
二:AWK簡介
- what is awk? 對於初學者來說這是個模式的代名詞,其實awk是三位創造者Aho、Weinberger和Kernighan統稱,
- 簡單的來說AWK 是一種用於處理文本的程式設計語言工具
- wk可以做些什嗎?由於其可以進行樣式裝入、流量控制、數學運算子、進程式控制制語句甚至於內建的變數和函數。
- 它具備了一個完整的語言所應具有的幾乎所有精美特性,所以其三位建立者已將它正式定義為“樣式掃描和處理語言”。
- 它允許您建立簡短的程式,這些程式讀取輸入檔案、為資料排序、處理資料、對輸入執行計算以及產生報表,還有無數其他的功能。
三:AWK處理文本的流程:
- awk在處理檔案時,首先掃描檔案中的每一行,尋找與命令列中所給定內容相匹配的模式。
- 如果發現匹配內容,則進行下一個編程步驟。如果找不到匹配內容,則繼續處理下一行
四:AWK的使用
- AWK的 文法格式:
- Awk [options] ‘scritpts’ filename
- 或者awk [options] ‘partern [actions] ’ filename
- [options]:
- -F: 指定awk 處理文本的行時的分隔字元
例如
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/1300491920-0.png" alt="" />
- 常用的awk內建的三個變數 OFS FS NF
- -FS 指定欄位分隔符號
- 例如
- Awk -v FS=: ‘{print $2}’ /etc/passwd
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/13004ac6-1.png" alt="" />
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/13004941D-2.png" alt="" />
- -v OFS= 定義awk 輸出時的字元分隔字元
- 例如: Awk –v OFS=# ‘{print $1,$2}’ /etc/passwd
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/1300493O9-3.png" alt="" />
- 注:上例中的在輸入$1和$2,$1,$2的形式是分別輸出$1和$2. $1 $2的形式是將$1和$2合并後輸出
- 如
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/13004943K-4.png" alt="" />
- NF 表示awk處理一行時的欄位總數
- 例如:輸出一行的最後一個欄位
- Awk ‘{print $NF}’ /etc/passwd
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/1300494A3-5.png" alt="" />
- 註:顯示一行的倒數第三個欄位
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/13004aG0-6.png" alt="" />
- printf 的使用
- 格式:printf format item1,item2,……
- 注意:
- 1:與print命令的最大不同是,printf 需要指定format
- 2:format用於指定後面的每個item的輸出格式
- 3:printf語句不會自動列印分行符號 \n
- 4:format格式的指示符都以%開頭,後跟一個字元
- format:
- %c :顯示字元的ASCII碼
- %d,%i :顯示字元的十進位整數
- %e,$E 科學計數法顯示數值
- %f :顯示浮點數
- %g ,%G :以科學計數法的格式或者浮點數的格式顯示數值
- %s 顯示字串
- %u 顯示不帶正負號的整數
- %% 顯示%自身
- 另外format 還可以添加修飾符
- N:顯示寬度
- -:靠左對齊
- +:顯示數值符號
- 例如:
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/1300491A0-7.png" alt="" />
- Awk 中使用 輸出重新導向
- print items > output-file
- print items >> output-file
- print items | command
awk的操作符:
- 算術操作符:
- -x: 負值
- +x: 轉換為數值;
- x^y:
- x**y: 次方
- x*y: 乘法
- x/y:除法
- x+y:
- x-y:
- x%y:
- 字串操作符:
- 只有一個,而且不用寫出來,用於實現字串串連;
- 賦值操作符:
- =
- +=
- -=
- *=
- /=
- %=
- ^=
- **=
- ++
- --
- 需要注意的是,如果某模式為=號,此時使用/=/可能會有語法錯誤,應以/[=]/替代;
- 布爾值
- awk中,任何非0值或非Null 字元串都為真,反之就為假
- 比較操作符:
- x < y True if x is less than y.
- x <= y True if x is less than or equal to y.
- x > y True if x is greater than y.
- x >= y True if x is greater than or equal to y.
- x == y True if x is equal to y.
- x != y True if x is not equal to y.
- x ~ y True if the string x matches the regexp denoted by y.
- x !~ y True if the string x does not match the regexp denoted by y.
- subscript in array True if the array array has an element with the subscript subscript
- 運算式間的邏輯關係符:
- &&
- ||
- 條件運算式:
- selector?if-true-exp:if-false-exp
- selector :條件運算式
- if-true-exp:statement
- if-false-exp: statement
- awk的模式:
- awk [options] ‘parten’ ‘print ….’ filename
- parten:
- 1:Regex 格式為/regular expression/
- 2: 運算式 其值非0或者非Null 字元時滿足的條件 例如:$1 ~ /user/ 或者 $1 == ‘user’
- 用運算子~(匹配)和 ~ !(不匹配)
- 例如:
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/1300493Y6-8.png" alt="" />
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/13004911N-9.png" alt="" />
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/130049D27-10.png" alt="" />
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/13004951M-11.png" alt="" />
- 指匹配範圍格式為pat1,pat2 pat代表模式)同sed用法
- BEGIN/END 特殊格式
- BEGIN :在awk執行動作之前的處理動作
- 讓使用者指定在第一條輸入記錄被處理之前所發生的動作,通常可在這裡設定全域變數
- END:在awk 執行動作完成後執行的動作
- 讓使用者在最後一條輸入記錄被讀取之後發生的動作
- 例如:
- Awk –F:’$NF ~/bash/ {print “username bash” ;printf “%-10s %s\n,$1,$NF”}’ /etc /passwd
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/13004ab2-12.png" alt="" />
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/1300494F0-13.png" alt="" />
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/1300493228-14.png" alt="" />
650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131228/1300491621-15.png" alt="" />
空模式是指 :匹配所有行由於篇幅限制字數限制不能全部介紹,如有錯誤,還望多多指正,多多討論,謝謝。下篇將繼續awk的迴圈控制語句的使用,
本文出自 “好望角” 部落格,請務必保留此出處http://haicang.blog.51cto.com/2590303/949060