awk簡單應用詳解

gawk:pattern scanning and processing language

語法:gawk [options] 'program' FILE ...

program:PATTREN{ACTION STATEMENTS}

選項:

-F :指明輸入數據時的字段分隔符

-v var=value:自定義變量

1、print

print item1,item2,...

要點:(1) 逗號分隔符

      (2) 輸出的各item可以是字符串,數值,字段(使用&引用),變量(直接輸入變量即可)或者awk表達式

      (3) 如果省略item,相當於print $0


2、變量

    內置變量

FS:input field seperator輸入時的分隔符:默認爲空白字符

OFS:onput field seperator輸出時的分隔符:默認爲空白字符

RS:input record seperator:輸入時的換行符

ORS:output record seperator:輸出時的換行符

                NF:number of field :每一行字段數量

NR:number of recor :行數

FNR:各文件分別計數:行數

FILENAME:當前文件名

                ARGC:命令行參數的個數 (命令前使用BEGIN只顯示一次)

ARGV:數組ARGV[#]:保存的是命令行中所給定的各參數

    自定義變量

(1)-v var=value 區分大小寫

                (2) 在program中直接定義

awk '{test="1";print test}' filename

若不對文件做處理:awk 'BEGIN{test="1";print test}'

3、printf命令

     格式化輸出:printf FORMAT(格式符),item1,item2,...

(1) FORMAT 必須給出

(2) 不會自動換行,需要顯示給出換行控制符 \n

(3) FORMAT需要分別爲後面的每個item指定一個格式化符號

            格式符:

%c :顯示字符的ASCII碼

%d,%i:顯示十進制整數

%e,%E:科學計數法數值顯示

%f:浮點數

%g,%G:科學計數法或浮點數

%s:字符串

%u:無符號整數

%%:顯示%自身

            修飾符:

#[.#]:第一個數字控制顯示的寬度,第二個顯示小數點後的精度(%3.1f)

-:左對齊,默認右對齊

+:顯示數值的符號(正負)

        4、操作符

    算數操作符

雙目:+-*/ ^ %

單目:-x   +x

字符串操作符:沒有符號的操作符,字符串連接

                賦值操作符:  =   +=  -= *= ...

比較操作符: >    >=    <    <=    !=     ==

模式匹配符:~   匹配

    !~ 不匹配

邏輯操作符:&& ||  !

函數調用:function_name(argu1,argu2,...)

條件表達式:select?if-true-expression:if-false-expression

        5、pattern

            (1) empty:空模式,匹配每一行

    (2) /regular expression/:正則表達式,僅處理匹配行

    (3) 條件表達式/關係表達式:結果有“真”“假”,處理結果爲“真”的行

真:結果爲非0值,非空字符串

    (4) line ranges:行範圍

startline,endline:/pat1/,/pat2/由模式匹配指出範圍

不支持直接給出數字的格式

                awk -F:'(NR>=2&&NR<=10){print $1}' /etc/passwd

            (5) BEGIN/END模式

BEGIN{} :僅在開始處理文件中文本之前執行一次的程序

END{}:僅在文本處理完成之後執行一次

        6、常用action

            (1) expressions 

    (2) control statements:if,while等

    (3) compound statements:組合語句:

    (4) input statements

    (5) output statements

        7、控制語句

            if(condition) {statements} else {statements} 

    while(conditon) {statements}

    do {statements} while(conditon)

    for(expr1;2;3) {statements} 

    break

    continue

    delete array[index]

    delete array

    exit

    { statements }

示例:

    1、-F:指明輸入數據時的字段分隔符,默認爲空白字符。示例爲使用“:”爲分隔符,並輸出第一組元素:

[root@localhost ~]# tail -n 5 /etc/passwd | gawk '{print $1}'
pulse:x:497:496:PulseAudio
sshd:x:74:74:Privilege-separated
tcpdump:x:72:72::/:/sbin/nologin
armo:x:500:500:CentOS
named:x:25:25:Named:/var/named:/sbin/nologin
[root@localhost ~]# tail -n 5 /etc/passwd | gawk -F: '{print $1}'
pulse
sshd
tcpdump
armo
named

    2、-v var=value與BEGIN共同使用:單獨使用BEGIN不處理文本,只做輸出動作,結合自定義變量的使用:(可使用選項定義,也在直接在program中定義變量)

[root@localhost ~]#  awk -v test=armo 'BEGIN{print test}'
armo
[root@localhost ~]#  awk 'BEGIN{test="armo";print test}'
armo

    3、內置變量的使用:NR:顯示行號

[root@localhost ~]# tail -n 5 /etc/passwd | awk -F: '{print  NR,$1,$2 }'
1 pulse x
2 sshd x
3 tcpdump x
4 armo x
5 named x
[root@localhost ~]#

    4、printf的格式化輸出

[root@localhost ~]# awk -F: '{printf ("%s,%s\n",$1,$2)}' /etc/passwd
root,x
bin,x
daemon,x
adm,x
lp,x
...
[root@localhost ~]# awk -F: '{printf ("%15s    --%5s\n",$1,$2)}' /etc/passwd
           root    --    x
            bin    --    x
         daemon    --    x
            adm    --    x
             lp    --    x
           sync    --    x
       shutdown    --    x
           halt    --    x
           mail    --    x
第一域字符寬度15,第二域字符寬帶5
[root@localhost ~]# awk -F: '{printf ("%-15s%+5.3f\n",$1,$3)}' /etc/passwd
root           +0.000
bin            +1.000
daemon         +2.000
adm            +3.000
lp             +4.000
sync           +5.000
shutdown       +6.000
第一域左對齊寬度15輸出,第三域顯示數值正負、寬度5、小數點後精確到三位輸出

    4、操作符使用說明示例

[root@localhost ~]# awk -v a=2 -v b=1 'BEGIN{print "sum="a+b }'
sum=3
[root@localhost ~]# awk -F: -v a=2 -v b=1 '{$3>=5?SUM=a+b:SUM=a+a;print $1,SUM}' /etc/passwd
root 4
bin 4
daemon 4
adm 4
lp 4
sync 3
shutdown 3
halt 3
mail 3
uucp 3

    5、pattern示例

[root@localhost ~]# awk -F: '(NR>=2&&NR<=10){print NR,$1}' /etc/passwd
2 bin
3 daemon
4 adm
5 lp
6 sync
7 shutdown
8 halt
9 mail
10 uucp
[root@localhost ~]#


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