awk的基本用法(一)

awk 的工做原理:

執行BEGIN{action;...}語句塊中的語句。
從文件或標準輸入(stdin)讀取一行,而後執行pattern{action;...}語句塊,它逐行掃描文件,從第一行到最後一行重複這一個過程,直到文件所有讀取完畢。
當讀至輸入流末尾時,執行END{action;...}語句塊。
BEGIN語句塊在awk開始輸入流中讀取以前執行。這是一個可選的語句塊,好比變量初始化、打印輸出表格的表頭等語句一般可寫在BEGIN語句塊中。
END語句塊在awk從輸⼊流中讀完全部的⾏以後被執⾏,⽐如打印全部⾏的分析結果這類信息彙總都是在END語句塊中完成,它也是⼀個可選語句塊。
pattern語句塊中的通⽤命令是最重要的部分,也是可選的。若是沒有提供attern語句塊,則默認執⾏{print},即打印每⼀個讀取到的⾏,awk讀取的每⼀⾏都會執⾏該語句塊。

注意:

逗號分隔符;
輸出的各item能夠是字符串,也能夠是數值;當前記錄的字段、變量或awk的表達式;
如省略item,至關於print $0.

awk基本用法:

-F:指明輸⼊時⽤到的字段分隔符;
-v var=value:⾃定義變量。

eg:
    awk -F: '{print $1}' /etc/passde
    指定:未分隔符,打印每行記錄的第一個字段即輸出$1

awk 的變量用法

內置變量:
FS:輸出自動分隔符。默認空白字符
OFS:輸出自動分隔符,默認空白字符
RS:輸出記錄分隔符,指定輸入時的換行符,原換行符仍有效
ORS:輸出記錄分隔符,輸出時用指定符號代替換行符
NF:字符數量
NR:行號
FNR:各文件分別計數,記錄號;
FILENAME:當前文件名;
ARGC:命令行參數的個數
ARGV:數組,保存的時命令行所給定的各參數數組

eg:bash

輸入字段分隔符FS:
    ~]# awk -v FS=':' '{print $1,FS,$3}' /etc/passwd
    root : 0
    bin : 1
    daemon : 2
    adm : 3
    lp : 4
    sync : 5
    ...
 輸⼊出字段分隔符OFS
    ~]# awk -v FS=':' -v OFS='----' '{print $1,$3,$7}' /etc/passwd
    root----0----/bin/bash
    bin----1----/sbin/nologin
    daemon----2----/sbin/nologin
    adm----3----/sbin/nologin
    lp----4----/sbin/nologin
    sync----5----/bin/sync
    shutdown----6----/sbin/shutdown
    ...
輸⼊記錄分隔符RS
    ~]# head -1 /etc/passwd | awk -v RS=':' '{print}'
    root
    x
    0
    0
    root
    /root
    ...
輸出記錄分隔符ORS
    ~]# awk -v OR=' ' -v ORS='----' '{print}' /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----
    ...
字段數量NF
    ~]#  awk -F: '{print NF}' /etc/passwd
    7
    7
    7
    7
    7
    ...
⾏號NR變量
    ~]#  awk -F: '{print NR,$1}' /etc/passwd
    1 root
    2 bin
    3 daemon
    4 adm
    5 lp
    6 sync
    7 shutdown
    ...
各⽂件分別的記錄號FNR
     ~]#  awk '{print FNR,$1}' /etc/fstab /etc/passwd
     1 UUID=0c239cec-c2f7-49b6-9090-c1adf0f074cb
    2 /dev/mapper/vg_magedu-lv_root
    3 /dev/mapper/vg_magedu-lv_swap
    1 root:x:0:0:root:/root:/bin/bash
    2 bin:x:1:1:bin:/bin:/sbin/nologin
    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4 adm:x:3:4:adm:/var/adm:/sbin/nologin
    ...
當前⽂件名FILENAME
     ~]#  awk '{print FILENAME,FNR,$1}' /etc/fstab /etc/passwd  
     /etc/fstab 1 UUID=0c239cec-c2f7-49b6-9090-c1adf0f074cb
    /etc/fstab 2 /dev/mapper/vg_magedu-lv_root
    /etc/fstab 3 /dev/mapper/vg_magedu-lv_swap
    /root/awktest.txt 1 root:x:0:0:root:/root:/bin/bash
    /root/awktest.txt 2 bin:x:1:1:bin:/bin:/sbin/nologin
    /root/awktest.txt 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    ...
命令⾏參數的個數ARGC
     ~]#  awk 'BEGIN {print ARGC}' /etc/fstab /etc/inittab 
     3
命令⾏給定的各參數的數組ARGV
    ~]#  awk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/inittab
    /etc/fstab

awk 自定義變量

eg: app

命令⾏給定的各參數的數組ARGV變量
    ~]#  awk -F: -v name='username:' '{print name,$1}' /etc/passwd
    username: root
    username: bin
    username: daemon
    username: adm
    ...

awk 的格式化輸出

格式符:與item一一對應
    %c:顯⽰字符的ASCII碼;
    %d,%i:顯⽰⼗進制整數;
    %e,%E:顯⽰科學計數法數值;
    %f:顯⽰爲浮點數;
    %g,%G:以科學計數法或浮點形式顯⽰數值;
    %s:顯⽰字符串;
    %u:⽆符號整數;
    %%:顯⽰%⾃⾝。
修飾符 :
    #[.#]:第⼀個#爲數字控制顯⽰的寬度,第⼆個#表⽰⼩數點後的精度,如%3.1f;
    -:左對齊(默認右對齊),如%-15s;
    +:顯⽰數值的正負號,如%+d。

awk 的操做符

賦值操做符:
    =:右邊賦值給左邊;
    +=:先加,再賦值;
    -=:先減,再賦值;
    *=:先乘,再賦值;
    /=:先除,再賦值;
    %=:先取餘,再賦值;
    ^=:先冪運算,再賦值;
    ++:遞增操做;
    --:遞減操做。
⽐較操做符:
    ==:判斷相等;
    !=:判斷不等;
    >:判斷⼤於;
    >=:判斷⼤於等於;
    <:判斷⼩於;
    <=:判斷⼩於等於。
模式匹配符:
    ~:左邊是否和右邊匹配包含;
    !~:是否不匹配。 
邏輯操做符:
    &&:邏輯與;
    ||:邏輯或;
    !:邏輯⾮。

共勉!

相關文章
相關標籤/搜索