簡介:
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)各項之間用逗号分割,實作出來有空格;若用空格顯示出來則無空格
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SZ2gzSxgTN5kDO4ADNx8VOzATM3MDOvwFNy8CX4ADNxAjMvwFduVWboNWY0RXYvwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.png)
(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]++
删除數組元素:需要從關系數組中删除數組的索引
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)