執行BEGIN{action;...}語句塊中的語句。 從文件或標準輸入(stdin)讀取一行,而後執行pattern{action;...}語句塊,它逐行掃描文件,從第一行到最後一行重複這一個過程,直到文件所有讀取完畢。 當讀至輸入流末尾時,執行END{action;...}語句塊。 BEGIN語句塊在awk開始輸入流中讀取以前執行。這是一個可選的語句塊,好比變量初始化、打印輸出表格的表頭等語句一般可寫在BEGIN語句塊中。 END語句塊在awk從輸⼊流中讀完全部的⾏以後被執⾏,⽐如打印全部⾏的分析結果這類信息彙總都是在END語句塊中完成,它也是⼀個可選語句塊。 pattern語句塊中的通⽤命令是最重要的部分,也是可選的。若是沒有提供attern語句塊,則默認執⾏{print},即打印每⼀個讀取到的⾏,awk讀取的每⼀⾏都會執⾏該語句塊。
逗號分隔符; 輸出的各item能夠是字符串,也能夠是數值;當前記錄的字段、變量或awk的表達式; 如省略item,至關於print $0.
-F:指明輸⼊時⽤到的字段分隔符; -v var=value:⾃定義變量。 eg: awk -F: '{print $1}' /etc/passde 指定:未分隔符,打印每行記錄的第一個字段即輸出$1
內置變量:
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
eg: app
命令⾏給定的各參數的數組ARGV變量 ~]# awk -F: -v name='username:' '{print name,$1}' /etc/passwd username: root username: bin username: daemon username: adm ...
格式符:與item一一對應 %c:顯⽰字符的ASCII碼; %d,%i:顯⽰⼗進制整數; %e,%E:顯⽰科學計數法數值; %f:顯⽰爲浮點數; %g,%G:以科學計數法或浮點形式顯⽰數值; %s:顯⽰字符串; %u:⽆符號整數; %%:顯⽰%⾃⾝。 修飾符 : #[.#]:第⼀個#爲數字控制顯⽰的寬度,第⼆個#表⽰⼩數點後的精度,如%3.1f; -:左對齊(默認右對齊),如%-15s; +:顯⽰數值的正負號,如%+d。
賦值操做符: =:右邊賦值給左邊; +=:先加,再賦值; -=:先減,再賦值; *=:先乘,再賦值; /=:先除,再賦值; %=:先取餘,再賦值; ^=:先冪運算,再賦值; ++:遞增操做; --:遞減操做。 ⽐較操做符: ==:判斷相等; !=:判斷不等; >:判斷⼤於; >=:判斷⼤於等於; <:判斷⼩於; <=:判斷⼩於等於。 模式匹配符: ~:左邊是否和右邊匹配包含; !~:是否不匹配。 邏輯操做符: &&:邏輯與; ||:邏輯或; !:邏輯⾮。