簡介:
grep、sed、awk爲三個主流的文本處理器,但是在處理上各有優缺點。這裏我們只介紹awk
AWK是一種優良的文本處理工具。它不僅是 Linux 中也是任何環境中現有的功能最強大的數據處理引擎之一。這種編程及數據操作語言(其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母)的最大功能取決於一個人所擁有的知識。AWK 提供了極其強大的功能:可以進行樣式裝入、流控制、數學運算符、進程控制語句甚至於內置的變量和函數。它具備了一個完整的語言所應具有的幾乎所有精美特性。實際上 AWK 的確擁有自己的語言:AWK 程序設計語言, 三位創建者已將它正式定義爲“樣式掃描和處理語言”。它允許您創建簡短的程序,這些程序讀取輸入文件、爲數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。
一、基本語法
awk [options] ‘program’ file file ..
awk [options] ‘PATTERN{action}’ file file…
輸出格式:print item1,item2。。。
(1)各項之間用逗號分割,實現出來有空格;若用空格顯示出來則無空格
(2)輸出的各項可以字符串,當前記錄字段,變量或awk的表達式;數值會被隱式轉換爲字符串後輸出
(3)如果後面的print後面的item省略,相當於print $0:輸出全部
===============================================================
二、awk的變量
主要分爲內置變量和自定義變量
(1)內置變量
FS:Filed Seperator | 輸入時的字段分割fu |
RS: | 輸入行分割符 |
OFS | 輸出時的字段分割符 |
ORS | 輸出時的行分割符 |
NF | 字段數 |
NR | 行數,所有文件一併計數 |
FNR | 行數,各文件分別計數 |
ARGV | 數組保存命令本身的字符 |
ARGC | 保存awk命令參數的個數 |
FILENAME | awk正在處理的當前文件的名稱 |
下面舉例顯示一下區別:
(a)使用不同的分割
(b)對文件行數計數
(c)對各文件分別計數
(d)使用數組保存命令本事的字符
(e)保存命令參數的個數
(f)顯示awk當前正在處理的文件系統的名稱
===============================================================
(2)自定義變量
-v var_name=VALUE //變量名區分字符大小寫
a.可以在program中定義
b.可以在命令行通過-v選項自定義
三、awk的printf用法
使用格式:printf format, item1, item2….
要指定format
不會自動換行,換行需要使用\n
format用於爲後面的每個item指定其輸出格式
(1)format的格式的指示符以%開頭,後面跟一個字符
%c | 顯示字符的ASCII碼 |
%d,%i | 十進制整數 |
%e | 科學計數法顯示數值 |
%f | 顯示浮點數 |
%g | 以科學計數法格式或浮點數格式顯示數值 |
%s | 顯示字符串 |
%u | 顯示無符號整數 |
%% | 顯示%自身 |
將字符轉換爲ASCII碼
打印爲十進制
講某數轉換爲科學計數格式
打印字符串
以浮點數的方式計數
其他就不一一演示了
=====================================================
(2)awk的輸出重定向
>, >>, |
特殊文件描述符:
/dev/stdin:標準輸入
/dev/stdout:標準輸出
/dev/stderr:錯誤輸出
========================================================
(3)awk的操作符
算術操作符:+ ,-,*,**,%,正負值:+x,-x
字符串操作符:連接
賦值操作符:=,+=,-=,*=,/=,%=,^=,**=,++,--
如果模式自身是等號,要寫爲/=/
比較操作符:< <= > >= == !* ~ !~
邏輯操作符:&& ||
(4)條件表達式
selector?if-ture-ezpression:if-false-expression
條件?爲真輸出的內容:爲假輸出的內容
四、函數調用
function_name (argu1,argy2)
(1) Regexp:格式/PATTERN/ //僅處理被/PATTERN/匹配到的行
(2)Expression:表達式,其結果爲非0或非空字符串時滿足條件:
僅處理滿足條件的行
(3)Ranges:行範圍,此前地址定界,startline,endline
僅處理範圍內的行
(4)BEGIN/END:特殊模式,僅在awk命令的program運行之前或運行之後執行一次
(5)Empty:空模式,匹配文件中的所有行
五、控制語句
(1) 格式:if (condition) {then body} [{else {else body}]
(2) 格式:while (condition) {while body}
#[root@bogon ~]# awk '{i=1;while (i>=NF) {if ($i>=20000) print $i;i++}}' test.txt
(3) 格式:do {do-while body} while (condition)
(4) 格式:for (variable assignment ; condition; iteration process) {for body}
#awk -F: '{for(i=1;i<=3;i++) { if (length($i)>=8) {print $i}}}' /etc/passwd
***for循環可以用來遍歷數組元素;語法:for (i in array) {for body}
#awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%-15s:%i\n",A,BASH[A]}}' /etc/passwd
(5)switch (expression) {case VALUE or /RGEEXP/: statement1;...default: statementN}
(6) break continue 循環控制
(7)next,提前結束本行的處理註解進入下一行的處理
六、 awk對於數組的應用
關聯數組
array[index-expression]
index-expression:可以使用任意字符串;如果某數組元素在引用時事先不存在,那麼在引用時awk會自動創建此元素並初始化爲空串,因此要判斷數組是否存在該元素,必須使用index in array 這中格式
A[first]="hello awk"
print A[second]
要遍歷數組中的每個元素,需要使用如下特殊結構
for (var in array) (for body)
其中var會遍歷數組的索引
state [LISTEN]++
state [LISTEN]++
刪除數組元素:需要從關係數組中刪除數組的索引
delete array[index]
七、awk的內置函數
1、 split(string,array[,fieldsep[,seps]]);
功能:將string表示的字符串以fielfsep爲分割符進行切片,並將結果保存在數組中,數組以1開
2、ength([string])
功能:返回string字符串中字符的個數;
substr(string, start [, length])
功能:取string字符串中的子串,從start開始,取length個;start從1開始計數;
tolower(s)
3、能:將s中的所有字母轉爲小寫
toupper(s)
功能:將s中的所有字母轉爲大寫