1.awk介紹
Linux文本處理三劍客:
1.grep,egrep:文本過濾
2.sed:行編輯器
3.awk報表生成器,格式化文本輸出
linux中把awk鏈接到了gawk,使用的是GNU項目中的awk。
AWK工作模式,讀取一行文本,利用內置或者指定的字段分隔符去分隔這行文本,把每字段賦值給內置的位置變量,如第一段$1,第二段$2……整行可以賦值$0然後引用。
awk是一種編程語言,用於在linux下對文本和數據進行處理。數據可以來自標準輸入、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux下的一個強大編程工具。它在命令行中使用,但更多是作爲腳本來使用。
2.awk基本語法和選項
2.1基本語法
gawk[options]’program’file file……
program:PATTERN(模式){ACTION(處理動作)STATEMENT(輸出字段)},由語句組成,語句之間由分號分隔
2.2awk選項
-F[]:指定輸入字段的分隔符
-v var=val:變量賦值
awk -F: '{print $1,$3}' /etc/passwd awk -v FS=":" '{print $1,$3}' /etc/passwd
2.3awk的輸出命令
print item….
注意:
1.item之間用逗號分隔,而輸出時使用輸出分隔符
2.輸出各item可以是字符串或者數值,也可以當前文本的字段($n),變量或者awk的表達式;數值會被隱式轉換成字符輸出。
3.print後面的item如果省略,輸出整行信息
2.4printf命令
2.4.1.printf format item……
注意:
1.format是必須的
2.不會自動換行,需指定
3.format要給每個item指定一個格式符
2.4.2.格式符以%開頭,後面跟一個字符
%c:顯示字符的ASCII碼
%d,%i:顯示十進制整數
%e,%E:科學計數法顯示數值
%f:顯示浮點數
%g,%G:以科學計數法格式或浮點數格式顯示數值
%s:字符串
%u:無字符的整數
%%:顯示%自身
2.4.3修飾符
#[.#]第一個數字顯示寬度如:%5s 第二個數字顯示精度如 :%5.4s
-:左對齊
+:顯示數值符號
2.4.4操作符
算數操作符
+ – * / ^ %:加 減 乘 除 次方 取餘
字符串操作符:字符串連接
賦值操作符:
=,+= ,–=
比較操作符:> >= < <= == !=
模式匹配符:~ !~
邏輯操作符:&& ||
條件表達式:selector?if-true-expression:if-false-expression
函數調用:
functiong_name()
2.5.PATTERN
1)/regular expression/:僅處理能被/regular expression/匹配到的行
2)relational expression:關係表達式
3)line ranges:行範圍,類似sed或者vim的地址定界
4)BEGIN/END:在運行awk運行程序之前運行一次BEGIN;在運行awk完之後執行一次END
5)empty:空模式,匹配任意行
2.6常用的action
1)表達式
2)控制語句
a)if-else語法,通常對行或者行中的字段做條件判斷
if(條件)statement[else statement]
if(條件){statement;} [else {statement;}]花括號內能有多個語句,用分號分隔。
b)while循環,通常在當前行各字段間循環
while(條件)statement
while(條件){statement;}
c)do-while循環
do statement while (condition)
d)for循環
for(expr1:….) {statement;}
e)gawk有對switch語句的支持
f)break,continue
break退出當前循環
continue提前結束本輪循環,進入下輪循環
g)next提前結束對本行的處理,進入下行
3)複合表達式
4)輸入語句
5)輸出語句
3.awk的變量
3.1內置變量
FS:字段分隔符,默認是空格
RS:記錄分隔符,默認爲換行符
OFS:輸出字段分隔符,默認是空格
ORS:輸出記錄分隔符,默認換行符
NF:當前記錄的字段數
NR:當前行數,所有文件一起計數
FNR:每個文件的行數
FILENAME:當前文件名
ARGC:命令行的參數個數
ARGV:命令行的數組,保存awk和他的參數
3.2自定義變量
-v var=val
變量區分大小寫
1)可以在programe中定義
2)可以用-v 定義
4.awk的數組Array
關聯數組:array[index-expression]
index-expression:
可以使用任意字符串;
如果某數組元素實現不存在,在引用時,awk會自動創建此元素並將其值初始化爲空串:因此,若要判斷數組是否存在某元素,要使用“index in array”進行;
例如:a[mon]=“Monday”
for循環在awk中有一個專用於遍歷數組元素
語法:for(var in array){for-body}
var會遍歷array的每一個索引,print array[var]
查詢文檔中字符串出現次數 awk '{for(i=1;i<=NF;i++) {count[$i]++}}END{for(n in count) {print n,count[n]}}' file 查詢日誌中ip出現次數 awk '{count[$1]++}END{for(n in count) {print n,count[n]}}' /var/log/httpd/access_log
5.函數
5.1內置函數
rand():返回0和1之間的隨機數
length([s]):字符串的長度
$ awk '{ print length( "test" ) }'
gsub(r,s [,t])以r模式查找t代表的字符串,將其替換成s表示的字符串
$ awk '{ gsub(/test/, "mytest"); print }' testfile 在整個文檔中匹配test,匹配的都被替換成mytest
sub(r,s [,t])以r模式查找t代表的字符串,將其第一次匹配替換成s表示的字符串
$ awk '{ sub(/test/, "mytest"); print }' testfile 在整個記錄中匹配,替換隻發生在第一次匹配發生的時
split(s,a[,r]):以r爲分隔符切割s字符串,結果保存在a代表的數組中,split函數的返回值是切割成的字段數。
例子,統計netstat -tan查詢的訪問狀態中tcp協議訪問的ip netstat -tan | awk '/^tcp/{num=split($5,ip,":");ipnum[ip[num-1]]++}END{for(n in ipnum);{print n,ipnum[n]}}' 先分段,把含IP的字段按冒號分隔,定義到ip數組中(num=split($5,ip,”:”)),把字段中ip地址取出來定義爲ipnum數組並且重複一次加1(ipnum[ip[num-1]]++)最後遍 數組,統計數值。
substr(s,i[,n]):從s字符串取子串,從i開始,取n個字符
$ awk '{ print substr( "hello world", 7,11 ) }' 截取了world字符
systime:取時間戳;
and(v1,v2)
5.2自定義函數
function f-name (p,q)
{
}