使用awk心得整理

前段時間用AWK處理文本生成報表,用起來很是不錯。在這裏作個記錄。
AWK擅長於文本處理和報表生成,有許多精心設計的特性,容許進行多種方式的編程,一旦學會,將給你們帶來新的數據處理體驗。

AWK 總結 1 一、方式&結構 1 二、行&列匹配與正則表達式 2 2.1行匹配 2 2.2列匹配 2 三、if判斷 循環(break,continue) 運算符 2 四、特殊符號 3 五、數組&內建函數 3 六、自定義函數和做用域 4 七、解決做用域 技巧 4node

一、方式&結構正則表達式

一、awk 'BEGIN{} {} END{}' $file //直接在命令行中 二、[root@node91 xie]# vi test.awk //把awk腳本寫入文件 !/bin/awk BEGIN{ //(注意)BEGIN 和 { 必須在同一行 FS=":"; } { print $1; } END{ //(注意)END 和 { 必須在同一行 } [root@node91 xie]# echo | awk -f test.awk $file //執行awk腳本處理來處理$file編程

AWK代碼結構數組

BEGIN塊初始化, {} 主題代碼 END塊用與最終輸出以及彙總操做bash

示列 //$_下標函數

awk 'BEGIN{FS=":" ; i=0} {i+=1;print $1} END{ print "--->",i,"lines" }' /etc/passwd命令行

二、行&列匹配與正則表達式 2.1行匹配 》awk 'BEGIN{} /root/{print $0} END{}' /etc/passwd 等價於 》awk 'BEGIN{} $0~/root/{print $0} END{}' /etc/passwd
root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin 2.2列匹配 》 awk 'BEGIN{FS=":"} $1~/root/{print $0} END{}' /etc/passwd //正則表達式 root:x:0:0:root:/root:/bin/bash 》 awk 'BEGIN{FS=":"} $1=="root"{print $0} END{}' /etc/passwd //選取某一列相等 root:x:0:0:root:/root:/bin/bash 》awk 'BEGIN{FS=":"} ($1=="root") &&($2=="x"){print $0} END{}' /etc/passwd //多個判斷 root:x:0:0:root:/root:/bin/bash 寫成文件 !/bin/awk BEGIN{FS=":" } ($1=="root") &&($2=="x") { //(注意)這裏必須在同一行,awk更想JAVA的打花括號方式 print $0 } END{ }設計

三、if判斷 循環(break,continue) 運算符 if awk 'BEGIN{FS=":"} {if($0~/root/ && $1=="root"){print $0}} END{}' /etc/passwd root:x:0:0:root:/root:/bin/bash for awk 'BEGIN{FS=":"} {print $0 ; for(i=0;i<3;i++){print "\n"}} END{}' /etc/passwd //每行打印三個空行 do_while awk 'BEGIN{} {print $0;i=0;do{ print "\n" ;i ++ }while(i<3) } END{}' /etc/passwd while awk 'BEGIN{} {print $0;i=0;while(i<3){ print "\n" ;i ++ }} END{}' /etc/passwd 運算符 awk 'BEGIN{i="0"} { i++;print i} END{}' /etc/passwd //awk 作數學運算時,把可以轉化爲數字的字符串作轉化,不能的轉化爲0code

四、特殊符號 FS 字段分隔符 awk 'BEGIN{i="t";FS=":"} { i++;print NF} END{}' /etc/passwd NF 字段數目 awk 'BEGIN{i="t";FS=":"} { i++;print NF} END{}' /etc/passwd NR 第幾行 awk 'BEGIN{i="t";FS=":"} { i++;print NR} END{}' /etc/passwd RS 記錄分隔符變量 默認爲\n cat /etc/passwd | xargs
cat /etc/passwd | xargs | awk 'BEGIN{RS="nologin"} {print "---"$0} {}'
OFS 打印逗號代替符 echo "" | awk 'BEGIN{OFS="---YES---"} {print "1","2"} END{}' ORS,全稱是「輸出記錄分隔符" echo "" | awk 'BEGIN{ORS="\n\n" ; OFS="---YES---"} {print "1","2";print "3",4} END{}'作用域

五、數組&內建函數 數組 !/bin/awk BEGIN{ months["Jan"]="01";months["Feb"]="02"; months["Mar"]="03";months["Apr"]="04"; months["May"]="05"; months["Jun"]="06"; months["Jul"]="07";months["Aug"]="08"; months["Sep"]="09";months["Oct"]="10"; months["Nov"]="11";months["Dec"]="12"; } { for(i in months){ print i," --->",months[i]; }

內建函數 awk 'BEGIN{FS=":"} {print "length->",length($0);print "index->",index($0,"root");print toupper($0) } END{}' /etc/passwd

六、自定義函數和做用域 自定義函數 echo | awk 'BEGIN{} function test(){ for(i=0;i<5;i++){print "------",i}}{ i=0;for(i=0;i<3;i++){print "^^^^",i ; test()} } END{}'

echo | awk 'BEGIN{} function test(){ for(j=0;j<5;j++){print "------",j}}{ i=0;for(i=0;i<3;i++){print "^^^^",i ; test()} } END{}'

七、解決做用域 技巧

利用函數參數局部化 echo | awk 'BEGIN{} function test(i){ for(i=0;i<5;i++){print "------",i}}{ i=0;for(i=0;i<3;i++){print "^^^^",i ; test()} } END{}'

若是x,y是輸入參數呢? echo | awk 'BEGIN{} function test(x,y,i){ for(i=0;i<5;i++){print "------",i}}{ i=0;for(i=0;i<3;i++){print "^^^^",i ; test()} } END{}'

技巧,加個標識隔開 echo | awk 'BEGIN{} function test(x,y,_END,i){ for(i=0;i<5;i++){print "------",i}}{ i=0;for(i=0;i<3;i++){print "^^^^",i ; test()} } END{}' 多個AWK文件?

相關文章
相關標籤/搜索