一.AWK簡介
awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。
awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk 是 AWK 的 GNU 版本。
awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 的確擁有自己的語言: AWK 程序設計語言 , 三位創建者已將它正式定義為“樣式掃描和處理語言”。它允許您創建簡短的程序,這些程序讀取輸入文件、為數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。
二.使用方法
awk '{pattern +action}' {filenames}
盡管操作可能會很復雜,但語法總是這樣,其中 pattern 表示 AWK 在數據中查找的內容,而action 是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程序中始終出現,但它們用於根據特定的模式對一系列指令進行分組。 pattern就是要表示的正則表達式,用斜槓括起來。
awk語言的最基本功能是在文件或者字符串中基於指定規則浏覽和抽取信息,awk抽取信息後,才能進行其他文本操作。完整的awk腳本通常用來格式化文本文件中的信息。
通常,awk是以文件的一行為處理單位的。awk每接收文件的一行,然後執行相應的命令,來處理文本。
--------------------------------------分割線 --------------------------------------
AWK簡介及使用實例 http://www.linuxidc.com/Linux/2013-12/93519.htm
AWK 簡介和例子 http://www.linuxidc.com/Linux/2012-12/75441.htm
Shell腳本之AWK文本編輯器語法 http://www.linuxidc.com/Linux/2013-11/92787.htm
正則表達式中AWK的學習和使用 http://www.linuxidc.com/Linux/2013-10/91892.htm
文本數據處理之AWK 圖解 http://www.linuxidc.com/Linux/2013-09/89589.htm
如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm
--------------------------------------分割線 --------------------------------------
三.調用awk的方式
有三種方式調用awk
1.命令行方式
1awk [-F field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。
在awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格。
2.shell腳本方式
將所有的awk命令插入一個文件,並使awk程序可執行,然後awk命令解釋器作為腳本的首行,一遍通過鍵入腳本名稱來調用。
相當於shell腳本首行的:#!/bin/sh
可以換成:#!/bin/awk
3.將所有的awk命令插入一個單獨文件,然後調用:
awk -fawk-script-file input-file(s)
其中,-f選項加載awk-script-file中的awk腳本,input-file(s)跟上面的是一樣的。
四.awk基本命令介紹
選項:
-F[:]:指明輸入字段分隔符
-v var=var :變量賦值,對內置變量或自定義變量賦值
實例1:以逗號為字段分隔符,打印文本內容的第一個字段和第三個字段(取到的結果就是用戶的用戶名和UID)
1 2 3 4 5#gawk -F: '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
略
無逗號就會連接兩個字段,逗號是輸出分隔符
1 2 3 4 5# gawk -F: '{print $1$3}' /etc/passwd
root0
bin1
daemon2
略
這種是awk+action的示例,每行都會執行action{print $1,$3}。
五.awk的輸出命令:print和printf
awk中同時提供了print和printf兩種打印輸出的函數。
5.1.print命令:
命令用法:
1printitem1,item2……
使用要點:
1.各item間使用逗號分割,而輸出時則使用輸出分隔符
2.輸出的各item可以是字符串或數值,當前記錄的字段($n),變量或awk的表達式;數值會被隱式轉換為字符進行輸出
3.print後面的item如果省略,相當於print $0(輸出整行);輸出空白使用print"";
5.2.printf命令:
命令格式:
1printf format,item1,item2……
使用要點:
1.format格式符必須使用
2.不會自動換行,需要手動添加行分隔符
3.format格式符中需要分別為後面的每個item指定一個格式符
格式符:都以%開頭,後跟一個字符
%c:顯示字符的ASCII碼;
%i,%d:顯示十進制整數;
%e,%E:科學計數法顯示數值;
%f:顯示浮點數;
%g,%G:以科學計數法格式或浮點數格式顯示數值;
%s:字符串;
%u:無符號整數;
%%:顯示%自身
修飾符:
#[.#]:第一個#顯示寬度,例如%30s;第二個.#顯示小數點後精度
-:左對齊
+:顯示數值符號
六.awk的變量
6.1.內置變量
records:行相關
fields:字段相關
FS: input field seperator,字段分隔符,默認為空白字符
#awk -v FS=":" '{print $1,$3}' /etc/passwd
OFS:output fieldseparator,輸出字段分隔符
語句與語句之間分隔符定義,默認是空格
# awk'BEGIN{FS=":"; OFS="="} {print $1,$3}' /etc/passwd
RS:input record seperator,輸入記錄的分隔符,默認為新行。
實例:以冒號為換行符,輸出全文內容
# awk -v RS=":" '{print $0}' /etc/passwd
ORS: Outpput Row Seperator, 輸出時的行分隔符;
默認的行分隔符一般都是換行,我們可以自定義為#
下面就是將所有以:為分隔符的替換成以#的分隔符:
# awk 'BEGIN{ RS=":";ORS="#"} {print $0}' /etc/passwd
NF:Number of Field,當前記錄的字段(field)個數
統計/etc/issue文件內每行字段的個數:
# awk '{print NF}' /etc/issue
注意:這裡NF是變量引用,可以不用加$,$NF顯示字段位置
NR: number of inputrecords ,當前文本的行數
如果有多個文件,這個數目會把處理的多個文件中行統一計數
FNR: 與NR不同的是,FNR用於記錄正處理的行是當前這一文件中被總共處理的行數
ARGV:數組,保存命令本身這個字符,awk'{print $0}' file1 file2,意味著ARGV[0]保存awk,
ARGC: 保存awk命令中參數的個數,不包含命令本身;
此命令中有3個參數,為awk /etc/fstab /etc/issue
FILENAME:當前文件名
IGNORECASE:控制是否忽略字符大小寫變量
6.2.自定義變量
直接使用
-v var=valname:變量名區分字符大小寫
1.可以在program中定義變量
2.可以在選項中定義變量
例如:
等同於:
# awk -v file="passwd" '{printfile,$1}' /etc/passwd
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-12/110939p2.htm