awk命令

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)

                {

                 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章