1. 程式人生 > >awk的簡單用法

awk的簡單用法

awk

目錄
1.awk的基本格式
2.awk中的變量
3.操作符

一.awd的基本格式

  awk [options] ‘program‘ file… 
           program:pattern{action statements;..}
                       pattern和action:
                         ?pattern部分決定動作語句何時觸發及觸發事件 BEGIN,END 
                         ? action statements對數據進行處理,放在{}內指明 print, printf 
  • 分割符、域和記錄

    awk執行時,由分隔符分隔的字段(域)標記$1,$2..$n稱 為域標識。$0為所有域。
    文件的每一行稱為記錄。
    省略action,則默認執行 print $0 的操作。
  • 工作原理
    1. 第一步:執行BEGIN{action;… }語句塊中的語句
    2. 第二步:從文件或標準輸入(stdin)讀取一行,然後執行pattern{ action;… }語句塊,它逐行掃描文件,從第一行到最後一行重復這 個過程,直到文件全部被讀取完畢。
    3. 第三步:當讀至輸入流末尾時,執行END{action;…}語句塊
      print格式:
      print item1, item2, ...
      要點
      1.逗號分隔符
      1. 輸出的各item可以字符串,也可以是數值;當前記錄的字段、 變量或awk的表達式
      2. 如省略item,相當於print $0
        printf
        格式化輸出:printf “FORMAT”, item1, item2, ...
        (1) 必須指定FORMAT
        (2) 不會自動換行,需要顯式給出換行控制符,\n
        (3) FORMAT中需要分別為後面每個item指定格式符
        格式符:與item一一對應
        %c: 顯示字符的ASCII碼
        %d, %i: 顯示十進制整數
        %e, %E:顯示科學計數法數值
        %f:顯示為浮點數 %g,
        %G:以科學計數法或浮點形式顯示數值
        %s:顯示字符串
        %u:無符號整數
        %%: 顯示%自身
        修飾符
        : #[.#]:第一個數字控制顯示的寬度;第二個#表示小數點後精度,%3.1f
        -: 左對齊(默認右對齊) %-15s
        +:顯示數值的正負符號 %+d

        二.awk中的變量

  • 1.內置變量
    1. FS:輸入字段分隔符,默認為空白字符
    2. OFS:輸出字段分隔符,默認為空白字符
    3. RS:輸入記錄分隔符,指定輸入時的換行符,原換行符仍有效
    4. ORS:輸出記錄分隔符,輸出時用指定符號代替換行符
    5. NF:字段數量
    6. NR:行號
    7. FNR:各文件分別計數,行號
    8. FILENAME:當前文件名
    9. ARGC:命令行參數的個數
      2.自定義變量
      -v var=value
      在program中直接定義

      三.操作符

      • 算術操作符:
        x+y, x-y, x
        y, x/y, x^y, x%y
        -x: 轉換為負數
        +x: 轉換為數值
        字符串操作符:沒有符號的操作符,字符串連接
        賦值操作符
        ++ 變量加1
        -- 變量減1
        +=將加的結果賦給變量
        -= 將減的結果賦給變量
        *= 將乘的結果賦給變量
        /+ 將除的結果賦給變量
        %= 將取模的結果賦給量
        ^= 將取冪的結果賦給變量

比較操作符:
== 等於
!= 不等於

大於
= 大於等於
< 小於
<= 小於等於
模式匹配符:
~:左邊是否和右邊匹配包含
!~:是否不匹配

            例子  

                       [root@centos6 ~]# cat /etc/passwd
                        root:x:0:0:root:/root:/bin/bash
                        bin:x:1:1:bin:/bin:/sbin/nologin
                        daemon:x:2:2:daemon:/sbin:/sbin/nologin
                        adm:x:3:4:adm:/var/adm:/sbin/nologin
                        lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

        只取前三行

                   [root@centos6 ~]# cat /etc/passwd | awk ‘NR<=3{print}‘
                                                root:x:0:0:root:/root:/bin/bash
                                                bin:x:1:1:bin:/bin:/sbin/nologin
                                                daemon:x:2:2:daemon:/sbin:/sbin/nologi
            只取出用戶名 格式為  name  用戶名

                         [root@centos6 ~]# cat /etc/passwd | awk -F: ‘ NR<=3{ print "name", $1 }‘
                                                        name root
                                                        name bin
                                                        name daemon
            取出用戶名及其uid 格式為  name:用戶名     uid:XXX

                [root@centos6 ~]# cat /etc/passwd | awk -F: ‘ NR<=3{ printf "name: %-10s uid: %s\n", $1,$3}‘
                                                name: root       uid: 0
                                                name: bin        uid: 1
                                                name: daemon     uid: 2

  取出用戶root的信息 

              [root@centos6 ~]# cat /etc/passwd | awk -F: ‘ $1~"root"{ print $0}‘
                                                    root:x:0:0:root:/root:/bin/bash

awk的簡單用法