awk 命令

    AWK是linux下對文本及數據進行掃描處理,數據可以來自標準輸入、文件、管道。把文件中讀取到的每一行的每個字段分別進行格式化,而後進行顯示;支持使用變量、條件判斷、循環、數組

              awk [options] 'script' FILE ...
              awk [options] '/pattern/{action}' FILE ...

AWK有兩處特殊的模式:GEGIN和END,被放置在沒有讀取任何數據之前以及在所有數據讀取完後執行

wKiom1b4ir2iCcrvAAGG62NprHs669.jpg



模式:
                  地址定界:/pat1/,/pat2/
                  /pattern/
                !/pattern/  取反匹配的

                  BEGIN:執行前的做準備工作

                  END: 執行後的收尾工作

        awk -F: 'BEGIN{print "UserName:\n------------"}$3>500{print $1}END{print "---------------"}' /etc/passwd
        awk 'BEGIN {FS=":"}$3>=500{print $1}' /etc/passwd   ### 執行前把分隔符改爲冒號
                 


1、AWK的分隔符與記錄字段

    (a)、分隔符:

            輸入分隔符:
                行分隔符  默認是$符、字段分隔符  默認是空白。

            輸出分隔符:
                行分隔符  默認是$符、字段分隔符  默認是空白。

            如果想修改默認的分隔符,可以通過-F指定,或在BEGIN重新對FS進行賦值。

    # awk 'BEGIN{FS = ":"}{print $1}'  /etc/passwd

    # awk -F : '{print $1}' /etc/passwd

    # echo 'hello world:is work' | awk -F "[:, ]" '{print $3}'  \\ 指定多個分隔符

    (b)、記錄字段

    AWK以分隔符把從文件中讀取一條記錄,記錄在$0中,分割後的多個字段分別存儲在$1....$NF,字段的個數爲NF

    # awk -F : '{print $1}'  /etc/passwd    \\ 輸出該文件的第一個字段

    # awk -F : '{print $NF}'  /etc/passwd   \\ 輸出該文件的最後一個字段

    # awk -F : '{print NF}'  /etc/passwd   \\ 輸出該文件的字段的個數

    

2、awk內置變量

        ARGC:命令行參數的個數

        FILENAME:當前輸入文檔的名稱

        FNR:輸入文件的當前記錄編號,當有多個文檔時有用

        NR:輸入流的當前記錄編號

        NF:字段數,可以說最後一個字段
        FS: 讀入行時使用的字段分隔符,默認爲空白
        OFS: 輸出時使用字段分隔符,默認爲空白

        ORS:輸出記錄分隔符,默認爲換行\n

        RS:輸入記錄分隔符,默認爲換行\n

      

3、表達式與操作符

+

-

*

/

%

^ 冪運算

--

++

+=

-=

/=

<

>

<=

>=

==

!= 不等於

~ 匹配

!~ 不匹配

&&  與

|| 或

# awk -F : '$3>500{print $1,$3}' /etc/passwd

# awk -F : '$NF~/bash$/{print $NF}' /etc/passwd

# awk '/^$/ {x+=1} END {print x}' /etc/rc.d/init.d/functions
72


*****************高級應用**********************************

1、if條件判斷

格式:

    if (表達式) 動作1; else動作2

awk  -F :   '{if ($3>500) print $1,"user";else print $1,"ADMIN"}'  /etc/passwd


2、while循環

格式1:

while (條件)
動作

# awk 'i=1 {} BEGIN { while (i<=10) {++i;print i}}'

格式2:

do 
動作
while (條件)

# awk 'BEGIN { do {++x;print x} while (x<=10)}'


3、for循環

格式:

for (變量;條件;計數器)

    動作

# awk 'BEGIN{for(i=1;i<=10;i++) print i}'


4、break與contiue

for (i=1;i<=10;i++) {
     if (i=5)
        continue     \\ 這裏用contiue,當符合條件時就會跳出循環,只有=5時不會打印,換成break則只會打印4行。
    print i
}


5、函數

getline函數

    作用,從輸入中讀取下一行內容,從下面df -h 輸出結果可以看出,有的剩餘餘量在第3列,有的在第4列,這樣只有通過判定NF字段數來截獲數據,如果遇到NF爲1的可以通過getline函數跳過當前行。

[root@zibbix ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_system-root  \\ 一行
                       29G  1.9G   26G   7% /
tmpfs                 504M     0  504M   0% /dev/shm
/dev/sda1             194M   27M  158M  15% /boot
/dev/mapper/vg_system-var  \\一行
                       20G  584M   18G   4% /var

[root@zibbix ~]# df -h | awk '{if(NF==1){getline;print $3};if(NF==6)print $4}'
26G
504M
158M
18G



 練習:
        1、顯示GID小於500的組;
        # awk -F : '$3<500{print $1}' /etc/group
        # awk -F : 'BEGIN{print "group name\n============="}$3<500{print $1}' /etc/group
        2、顯示默認shell爲nologin的用戶;
        # awk -F : '$7~/nologin$/{print $1}' /etc/passwd
        3、顯示eth0網卡文件的配置信息,注意,只顯示等號後面的值;
        # awk -F = '{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0
        4、顯示/etc/sysctl.conf文件中定義的內核參數;只顯示名稱;
        # awk -F = '!/^#|^$/{print $1}' /etc/sysctl.conf
        # awk -F = '/^[^#]/{print $1}' /etc/sysctl.conf
        5、顯示eth0網卡的ip地址;通過ifconfig的命令結果進行過濾
        # ifconfig eth0 | awk '/inet addr/{print $2}' | awk -F: '{print $2}'

        # ifconfig eth0 | awk -F "[:, ]" '/inet addr/{print $13}'
            192.168.0.28 \\ 第二種結果的缺點是,如果空白字符有多個也算在內










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