shell編程awk基礎介紹


awk介紹

         報告生成器,格式化文本輸出

         處理機制類似sed命令,自帶循環處理    讀入一行處理一行然后自動讀取下一行再進行處理

         sed命令換行的標識是固定的,只能是回車換行.    awk里面的換行符是可以自定義的.

         awk自動把讀入的行按照指定的切割符號切割成若干個字段   默認的切割符號是空白符號(包括連續的空白符號,tab鍵,回車換行符)

        

 

  基礎語法

     awk  [options]   'program'  var=value    file

     awk  [options]  -f programfile  var=value   file

     awk [options]   'BEGIN{action;..} pattern{ action;....} END {action;....}'   file

    通常由:  BEGIN語句塊    能夠使用模式匹配的通用語句塊     END語句塊    三部分組成

      第一步:  先執行 BGEIN 語句塊  經常用於打印表頭

      第二步:  從文件或者標准輸入讀取一行,然后執行pattern語句 它會逐行掃描文件,直到文件全部讀取完畢

      第三步: 處理完文件或者輸入流的最后一行后,最后執行的語句塊  經常用於進行數據匯總

      pattern語句如果沒有提供 默認執行 {print } 就是打印每一個讀取到的行

 選項 options   

      -F   指明輸入時用到的字段分隔符號

      -v   var=value  自定義變量

awk內置變量

    FS        表示把行按照這個變量進行切割成列
   OFS      表示按這個字符把列進行拼裝組合輸出
   RS        表示按照這個變量作為行的分隔符
   ORS      表示以這個符號連接每行輸出的結果
   NF         表示字段的數量大小
   NR         表示行號
   FNR       多個文件的時候各自的文件行號
   FILENAME       表示當前的文件名稱

   FS:輸入字段分隔符,默認為空白字符 

     awk -v FS=':'  '{print $1,FS,$3}’ /etc/passwd 

     awk  –F:   '{print $1,$3,$7}’ /etc/passwd 

  OFS:輸出字段分隔符,默認為空白字符 

      awk  -v FS=‘:’  -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd 

   RS:輸入記錄分隔符,指定輸入時的換行符     默認是換行符

     awk -v RS=' ' ‘{print }’ /etc/passwd 

  ORS:輸出記錄分隔符,輸出時用指定符號代替換行符    默認是換行符

     awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd 

  NF:字段數量 

     awk  -F: ‘{print NF}’ /etc/fstab

     awk  -F:  '{print NF,"----"$NF"----"$(NF-1)}'       /etc/passwd    

  引用內置變量不用$   

     awk  -F:  '{print $(NF-1)}'  /etc/passwd 

  NR:記錄號     

     awk '{print NR}'  /etc/fstab ; awk END'{print NR}'  /etc/fstab

  FNR:各文件分別計數自己的記錄號 

     awk '{print FNR}'  /etc/fstab /etc/inittab

  FILENAME:當前文件名 

     awk '{print FILENAME}’  /etc/fstab

  ARGC:命令行參數的個數 

       awk '{print ARGC}’  /etc/fstab /etc/inittab 

       awk ‘BEGIN {print ARGC}’  /etc/fstab /etc/inittab

  ARGV:數組,保存的是命令行所給定的各參數 

     awk ‘BEGIN {print ARGV[0]}’  /etc/fstab /etc/inittab         ARGV[0]代表的awk自己本身  ARGV[1] 代表/etc/fstab  ARGV[2]代表/etc/inittab

     awk ‘BEGIN {print ARGV[1]}’  /etc/fstab /etc/inittab

 

awk自定義變量

   自定義變量(區分字符大小寫) 

    (1) -v var=value   

    (2) 在program中直接定義 

    (3) 變量最好先定義賦值然后再去使用

 

printf格式化輸出

      1.輸出信息默認不會換行,需要顯示指定換行控制符 \n

      格式符:

          1. %c            顯示字符的ASCII碼

          2. %d,%i       顯示十進制數字

          3.  %s           顯示字符串

          4.  %%         顯示%自身

          5. %f            顯示浮點數

       awk -F: '{printf "%s:%s\n",$1,$3}'     /etc/passwd

       awk -F: 'BEGIN{print "username      uid"}{printf"%s   %s\n", $1,$3}'    /etc/passwd

 

awk實例

 1 從文件中讀取program
 2 cat awkscript  
 3   {print script,$1,$2} 
 4 [root@centos7 ~]# awk -F: -f awkscript script="awkkk" /etc/passwd
 5 awkkk root x
 6 awkkk bin x
 7 awkkk daemon x
 8 [root@centos7 ~]# awk -F: '{printf"Username: %s\n",$1}' /etc/passwd
 9 Username: root
10 Username: bin
11 Username: daemon
12 輸出json字典
13 [root@centos7 ~]# awk -F: '{printf "Username:%s,UID:%d\n",$1,$3}' /etc/passwd
14 Username:root,UID:0
15 Username:bin,UID:1
16 [root@centos7 ~]# awk -F: '$0 ~ /root/{print $1}' /etc/passwd
17 root
18 operator
19 rooter
20 [root@centos7 ~]# awk -F: '$0 ~ /^root/{print $1}' /etc/passwd
21 root
22 rooter
23 awk '$0 !~ /root/' /etc/passwd
24 bin:x:1:1:bin:/bin:/sbin/nologin
25 daemon:x:2:2:daemon:/sbin:/sbin/nologin
26 [root@centos7 ~]# awk -F: '$3==0' /etc/passwd
27 root:x:0:0:root:/root:/bin/bash
View Code
 1 [root@centos7 ~]# awk '{print 2^10}'
 2 e
 3 1024
 4 [root@centos7 ~]# awk -F: '{print $1":"$3}' /etc/passwd
 5 root:0
 6 bin:1
 7 daemon:2
 8 [root@centos7 ~]# df | awk '{print $1,$3}'
 9 Filesystem Used
10 /dev/sda2 4347496
11 devtmpfs 0
12 tmpfs 0
13 [root@centos7 ~]# awk -v FS=: '{print $1,$3}' /etc/passwd
14 root 0
15 [root@centos7 ~]# awk -v FS=: '{print $1FS$3}' /etc/passwd
16 root:0
17 shell變量傳遞給awk
18 [root@centos7 ~]# fs=":";awk -v FS=$fs '{print $1FS$3}' /etc/passwd
19 root:0
20 bin:1
21 
22 [root@centos7 ~]# awk -v ORS="****" '{print $1}' a2
23 1****3****o****2****o****4****You have new mail in /var/spool/mail/root
24 [root@centos7 ~]# awk '{print $1}' a2
25 1
26 3
27 o
28 2
29 o
30 4
View Code
 1 [root@centos7 ~]# df | grep '^/dev/sd'|awk '{print $1,$5}'
 2 /dev/sda2 9%
 3 /dev/sda3 1%
 4 /dev/sda1 20%
 5 [root@centos7 ~]# df | grep '^/dev/sd'|awk -v FS=% '{print $1}'
 6 /dev/sda2       52403200 4347456  48055744   9
 7 /dev/sda3       31441920   83004  31358916   1
 8 /dev/sda1        1038336  198256    840080  20
 9 [root@centos7 ~]# df | grep '^/dev/sd'|awk -v FS=% '{print $1}'|awk '{print $1,$5}'
10 /dev/sda2 9
11 /dev/sda3 1
12 /dev/sda1 20
13 [root@centos7 ~]# awk -F: '{print NF,$NF,$(NF-1)}' /etc/passwd
14 7 /bin/bash /root
15 7 /sbin/nologin /bin
16 7 /sbin/nologin /sbin
17 7 /sbin/nologin /var/adm
18 7 /sbin/nologin /var/spool/lpd
View Code


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM