awk應用

awk應用linux

1、awk格式和選項

awk [options] 'script' var=value file(s) 
awk [options] "PATTRN  {'aciton'}" file(s) 

經常使用命令選項正則表達式

-F fs   fs指定輸入分隔符,fs能夠是字符串或正則表達式,如-F:shell

-v var=value   賦值一個用戶定義變量,將外部變量傳遞給awkexpress

-f scripfile  從腳本文件中讀取awk命令數組

-m[fr] val   對val值設置內在限制,-mf選項限制分配給val的最大塊數目;-mr選項限制記錄的最大數目。這兩個功能是Bell實驗室版awk的擴展功能,在標準awk中不適用。tcp

2、awk的模式(PATTERN)

  awk 'program' input-file1 input-file2url

   其中program爲:spa

     pattern{action}.net

     pattern{action}命令行

(一)常見的模式類型

   一、正則表達式:格式爲/regular expression/

       二、表達式:其值非0或非空字符串時知足條件,如:$1 ~/foo/ ,用運算符~(匹配)和~!(不匹配)

       三、範圍:指定匹配範圍,格式:awk -F '/^r/,/^m/{print $1,$2}' /etc/passwd 以r開頭到m開頭截止

       四、BEGIN/END:特殊模式,僅在awk命令前運行一次或結束前運行一次

       五、空模式:匹配任何數行

(二)常見的action

     一、表達式,判斷表達式等

     二、控制語句(if,for等)

     三、複合語句:重定向到其餘文件

     四、輸入輸出語句

3、awk的輸出

 (一)print輸出

 格式:print item1,item2 ,...

要點:

      一、各項目之間用逗號隔開,而輸出時則以空白字符分隔;

      二、輸出的item能夠是字符串或數值、當前記錄的字段(如$1)、變量或awk的表達式;數值會轉換爲字符串再輸出;

      三、print命令後面的item能夠省略,此時至關於 print $0;若是想輸出空白行,則需使用print "";

例子:

   #awk 'BEGIN{print "how are you"}'

   awk -F: '{print $1,$2}' /etc/passwd   

分析:print中的$0表示本身,$1表示awk切分的片爲第1片,$2爲第2片。

(二) awk變量

  2.一、awk內置變量之記錄變量

  FS:讀取文檔時,所使用的字段分隔符,默認爲空白字符。

  OFS:打印輸出時,所使用的字段分隔符,默認爲空白字符。

  RS:輸入文本信息時所使用的換行符,默認是"\n"

  ORS:打印輸出時所使用的換行符,默認是"\n"

例子:

         awk 'BEGIN(OFS="\t")'{print $1 ,$2} /etc/passwd

  2.二、awk內置變量之數據的變量

       NR:命令所處理的記錄數:若是有多個文件,這個數目會把處理的多個文件中行統一計數;

       FNR:與NR不一樣的是,FNR用於記錄正處理的行,是當前這一文件中總共處理的行數;

       NF:當前記錄的字段個數 

       ARGV:數組,保存命令自己這個字符串;

          如:awk '{print $0}' a.txt b.txt 這個命令中,ARGV[0]保存awk,ASGV[1]保存a.txt

       ARGC: awk命令的參數個數

       FILENAME: awk命令所處理的文件名稱

       ENVIRCN:當前shell環境變量及值的關聯數組

          如:awk 'ENGIN{print ENVIRCN["PATH"]}'

2.三、用戶自定義變量

awk容許用戶自定義本身的變量在程序代碼中使用,變量名規則是隻能使用字母、數字和下滑線,數字不能開頭。區分大小寫。

2.3.1   在腳本中賦值變量

在awk中給變量賦值:

例:

awk 'BEGIN{var ="good";print var}'

2.3.2 在命令行中使用賦值變量

awk能夠在"腳本"外爲變量賦值,並在腳本中引用。例如:上述可改成:

awk -v var="good" 'BEGIN{print var}'

4、printf格式輸出

printf命令使用格式:

printf format ,item1,item2,..

要點:

   一、printf 須要指定format(格式);

   二、format用於指定後面每一個item的輸出格式;

   三、printf語句不會自動打印換行符:\n

format格式指示符(以%開頭後跟一個字符):

  %c:顯示字符

  %s:顯示字符串

  %d,%i:十進制數

   %e,%E:科學計數法

   %f:浮點數

   %g,%G:以科學計數法的格式或浮點格式顯示數值

 %u:無符號整數

   %%:顯示自身

修飾符:

    N:顯示寬度

    -:左對齊,默認是右對齊

    +:顯示數值符號

例子:

      awk -F: '{printf "%-15s %i\n",$1,$3}' /etc/passwd

5、輸出重定向

 print items > output-file

 print items > output-file

 print items | command

特殊文件描述符:

     /dev/stdin: 標準輸入

    /dev/stdout:標準輸出

    /dev/stderr:錯誤輸出

   /dev/fd/N:某特定文件描述符,如/dev/stdin 就至關於/dev/fd/0

例子:

awk -F:'{printf "%15s %i\n",$1,$2 >"/dev/sderr"}' /etc/passwd

6、awk的操做符

注意:> < 能夠做爲字符串比較,也能夠用做數值比較,關鍵看操做數若是是字符串就會轉換爲字符串比較。兩個都爲數字才轉爲數值比較。字符串比較:按照ASCII碼順序比較。

7、數組

   (一)、數組的定義

            array[index-expression]

                 一、數字作數組下標

      Arr[1]="sun" 
      Arr[2]="uu"

                 二、字符串作數組下標

      Array["first"]="www" 
      Array["last"]="name" 
      Array["birth"]="1987"

  index-expression能夠是任意字符串,須要注意的是若是某數據組元素事先不存在,那麼在其引用時,awk會自動建立次元素並初始化爲空字符串,所以要判斷某數據組中使用index in array方式

要遍歷數組中每個元素,須要使用以下結構:

for (var in arrar) {statement1,...}

其中 var用於引用數組下標,而不是元素值;

例子:

     netstat -ant | awk '/^tcp/ {S[$NF]++} END{for (a in S ) print a,S[a]}'

    每出現一次/^tcp/模式匹配到的行,數組S[$NS]就加1,NF爲當前行的最後一個字段,此處用其值做爲數組S的元素索引;

    awk '{counts[$1]++}END {for(url in counts) print counts[url],url}'  /var/log/httpd/access_log

(二)刪除數組

  delete array[key]

     能夠刪除,對應數組key的,序列值。

例:

  awk 'BEGIN{t1["a"]="a",t1["b"]="b"} delete t1["a"] END{for(k in t1) print t1,t1[k]}'

8、流程控制語句

     每條命令語句後面能夠用;分號結尾。

      條件判斷語句

if(表達式) 
{語句1} 
else if(表達式) 
{語句2} 
else 
{語句3}

例子:

awk 'BEGIN{ test=100; 
if(test>90)
{ print "very good"; 
} else if(test>60)
{ print "good"; } else { print "no pass";
}
}'

  循環語句

while語句

while(表達式) 
{語句}

例子:

awk 'BEGIN{ 
test=100; 
total=0; 
while(i<=test){
 total+=i; i++; 
 } 
 print total; 
 }' 
 5050

for循環

for循環有兩種格式:

格式1

for(變量 in 數組) 
{語句}

例1:

awk 'BEGIN{
name[1]="aa",
name[2]="bb"
}
END{
 for (k in name){
 print name[k],k 
}
}'

例2

awk 'BEGIN{ 
for(k in ENVIRON){
 print k"="ENVIRON[k];
 }

 }' 


TERM=linux
 G_BROKEN_FILENAMES=1 
SHLVL=1 pwd=/root/text 
... 
logname=root
 HOME=/root 
SSH_CLIENT=192.168.1.21 53087 22

注:ENVIRON是awk常量,是子典型數組。

 

格式2:

for(變量;條件;表達式) 
{語句}

例:

awk 'BEGIN{
 total=0; for(i=0;i<=100;i++){
 total+=i; 
} print total; 
}' 
5050

do循環

do {語句} 
while(條件)

例:

awk 'BEGIN{ 
total=0; i=0; 
do {total+=i;i++;}
 while(i<=100) 
print total; 
}' 
5050

其餘語句

break 當 break 語句用於 while 或 for 語句時,致使退出程序循環。

continue 當 continue 語句用於 while 或 for 語句時,使程序循環移動到下一個迭代。

next 能可以致使讀入下一個輸入行,並返回到腳本的頂部。這能夠避免對當前輸入行執行其餘的操做過程。

exit 語句使主輸入循環退出並將控制轉移到END,若是END存在的話。若是沒有定義END規則,或在END中應用exit語句,則終止腳本的執行。更多:http://man.linuxde.net/awk#awk命令格式和選項

相關文章
相關標籤/搜索