一、awk介紹
AWK是一種優良的文本處理工具。它不僅是 Linux 中也是任何環境中現有的功能最強大的數據處理引擎之一。這種編程及數據操作語言(其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母)的最大功能取決於一個人所擁有的知識。AWK 提供了極其強大的功能:可以進行樣式裝入、流控制、數學運算符、進程控制語句甚至於內置的變量和函數。它具備了一個完整的語言所應具有的幾乎所有精美特性。實際上 AWK 的確擁有自己的語言:AWK 程序設計語言, 三位創建者已將它正式定義為“樣式掃描和處理語言”。它允許您創建簡短的程序,這些程序讀取輸入文件、為數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。
快速掌握awk的技巧:只要記住awk是以行為單位讀入和輸出的。
二、awk常用選項和命令
| -F | 指定字段一個或多個分割符 例如:-F'[:#/]' 定義三個分隔符 |
| -v | 定義或修改一個awk內部的變量 |
| NR | 行號 |
| FS | 字段的分隔符,默認為空格,跟-F選擇一樣 |
| OFS | 輸出的字段分隔符,默認為空格(即把空格替換成指定的字符串) |
| RS | 輸入記錄的分割,以分割符分割之后,使之成為新的行(即讀入行的時候遇到指定分隔符,就把分割替換成\n)。 |
| ORS | 輸出的記錄分隔符,默認為新行。(即讀入行的時候遇到\n之后把\n用指定的分隔符代替,然后讀入一行,並合並為同一行) |
| $NF | 表示最后一列 |
| $0 | 顯示當前一整行 |
| $N | N為數字(N>0),表示第幾列。例如:$1表示用-F指定分隔符分隔后的第一列,$2...$N以此類推 |
| {} | 命令代碼塊,包含一條或多條命令 |
| ; | 多條命令使用分號分隔 |
| ~ | 匹配字段,與==相比不是精確比較 |
| !~ | 不匹配,不精確比較 |
| == | 等於,必須全部相等,精確比較 |
| > | 大於 |
| < | 小於 |
| >= | 大於等於 |
| <= | 小於等於 |
| != | 不等於,精確比較 |
| && | 邏輯與 |
| || | 邏輯或 |
| + | 匹配1個或1個以上 |
| // | 正則匹配符 |
| 輸出、打印 |
三、AWK的選項
| 選項 | 描述 |
| -f progfile --file=progfile |
從腳本文件中讀取awk命令 |
| -F fs --field-separator=fs |
指定字段一個或多個分割符 例如:-F'[:#/]' 定義三個分隔符 |
| -v var=val --assign var=val |
定義或修改一個awk內部的變量 |
| -b --characters-as-bytes |
將所有輸入數據視為單字節字符。posix選項或覆蓋這個選項 |
| -c --traditional |
在兼容模式下運行。在兼容模式下,gawk的行為與UNIX awk相同;沒有一個可以識別特定於gn的擴展 |
| -C --copyright |
在標准輸出和退出中成功打印GNU版權信息消息的簡短版本 |
| -d[file] --dump-variables[=file] |
將全局變量的排序列表、它們的類型和最終值打印到文件中。如果沒有提供文件,gawk使用一個名為awkvars的文件 |
| -e 'program-text' --source='program-text' |
使用程序文本作為AWK程序源代碼。這個選項允許輕松地將庫函數(通過-f和-file選項使用)與在命令行中輸入的源代碼混合使用。它主要用於shell腳本中使用的中型到大型AWK程序 |
| -E file --exec=file | 與-f類似,這是最后一個處理的選項。這應該與#一起使用!腳本,特別是為CGI應用程序,以避免從URL向命令行傳遞選項或源代碼(!)。這個選項禁止命令行變量賦值 |
| -g --gen-pot |
掃描和解析AWK程序,並在標准輸出上生成GNU .pot(可移植對象模板)格式文件,其中包含程序中所有可本地化字符串的條目。程序本身沒有執行。 |
| -h --help |
簡短的打印幫助 |
| -L [fatal] --lint[=fatal] |
提供關於可疑或不可移植到其他AWK實現的構造的警告 |
| -n --non-decimal-data |
識別輸入數據中的八進制和十六進制值 |
| -N --use-lc-numeric |
使用句點作為小數點 |
| -O --optimize |
在程序的內部表示上啟用優化。目前,這包括簡單的常數合並 |
| -p[file] --profile[=file] |
將分析數據發送到PROFIX文件。默認值是DouthPo.OUT |
| -P --posix | 啟動兼容模式;將有如下限制: |
| -r --re-interval | 允許在正則表達式匹配中使用區間表達式 |
| -R --command file | 只有DGAWK。從文件讀取存儲的調試器命令 |
| -S --sandbox | 在沙盒模式下運行GOWK,禁用Stand()函數,用GETLIN輸入重定向,輸出Read打印和打印的方向,並加載動態擴展。命令執行(通過管道)也被禁用。這有效地阻止了腳本訪問本地資源(除了 |
| -t --lint-old | 提供對UNIX AWK原始版本不可移植的結構的警告 |
| -V --version | 打印AWK的版本信息 |
四、AWK的環境變量
| 變量 | 描述 |
| $N | N為數字(N>0),表示第幾列。例如:$1表示用-F指定分隔符分隔后的第一列,$2...$N以此類推 |
| $0 | 顯示當前一整行 |
| $NF | 表示最后一列 |
| ARGC | 命令行參數的數目 |
| ARGIND | 命令行中當前文件的位置(從0開始算) |
| ARGV | 包含命令行參數的數組 |
| CONVFMT | 數字轉換格式(默認值為%.6g) |
| ENVIRON | 環境變量關聯數組 |
| ERRNO | 最后一個系統錯誤的描述 |
| FIELDWIDTHS | 字段寬度列表(用空格鍵分隔) |
| FILENAME | 當前文件名 |
| NR | 行號(當前記錄數) |
| FNR | 同NR,但相對於當前文件 |
| FS | 字段的分隔符,默認為空格,跟-F選擇一樣 |
| OFS | 輸出的字段分隔符,默認為空格(即把空格替換成指定的字符串) |
| IGNORECASE | 如果為真,則進行忽略大小寫的匹配 |
| NF | 當前記錄中的字段數 |
| OFMT | 數字的輸出格式(默認值是%.6g) |
| RLENGTH | 由match函數所匹配的字符串的長度 |
| RS | 輸入記錄的分割,以分割符分割之后,使之成為新的行(即讀入行的時候遇到指定分隔符,就把分割替換成\n(默認是\n)) |
| ORS | 輸出的記錄分隔符,默認為新行。(即讀入行的時候遇到\n之后把\n用指定的分隔符代替,然后讀入一行,並合並為同一行)(默認值是一個換行符) |
| RSTART | 由match函數所匹配的字符串的第一個位置 |
| SUBSEP | 數組下標分隔符(默認值是\034) |
五、AWK的運算符
| 運算符 | 描述 |
| = += -= *= /= %= ^= **= | 賦值 |
| 條件表達式?值1:值2 | 三目運算符 |
| || | 邏輯或 |
| && | 邏輯與 |
| ~ ~! | 匹配正則表達式和不匹配正則表達式 |
| < <= > >= != == | 關系運算符 |
| 空格 | 連接符 |
| + - | 加,減 |
| * / % | 乘,除與求余 |
| + - ! | 一元加,減和邏輯非 |
| ^ *** | 冪運算符 |
| ++ -- | 增加或減少,作為前綴或后綴 |
| $ | 字段引用 |
| in | 數組成員 |
六、AWK的內置的字符串函數
| 函數名稱 | 描述 |
| gsub(r,s) | 在整個$0中用s代替r |
| gsub(r,s,t) | 在整個t中用s替代r |
| index(s,t) | 返回s中字符串t的第一位置 |
| length(s) | 返回s長度 |
| match(s,r) | 測試s是否包含匹配r的字符串 |
| split(s,a,fs) | 在fs上將s分成序列a |
| sprint(fmt,exp) | 返回經fmt格式化后的exp |
| sub(r,s) | 用$0中最左邊最長的子串代替s |
| substr(s,p) | 返回字符串s中從p開始的后綴部分 |
| substr(s,p,n) | 返回字符串s中從p開始長度為n的后綴部分 |
七、AWK使用演示
1、演示文本
[root@WT data]# cat test.txt shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin wt:x:1000:1000:wt:/home/wt:/bin/bash test2:x:1001:1001::/home/test2:/bin/bash
2、{}命令代碼塊及print的使用
•{} 代碼塊
•print 輸入、打印內容
1 [root@WT data]# awk '{print}' test.txt 2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 3 halt:x:7:0:halt:/sbin:/sbin/halt 4 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 5 operator:x:11:0:operator:/root:/sbin/nologin 6 games:x:12:100:games:/usr/games:/sbin/nologin 7 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 8 ntp:x:38:38::/etc/ntp:/sbin/nologin 9 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 10 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 11 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 12 dbus:x:81:81:System message bus:/:/sbin/nologin 13 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 14 nobody:x:99:99:Nobody:/:/sbin/nologin 15 abrt:x:173:173::/etc/abrt:/sbin/nologin 16 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 17 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 18 wt:x:1000:1000:wt:/home/wt:/bin/bash 19 test2:x:1001:1001::/home/test2:/bin/bash
3、NR的使用
•顯示行號
[root@WT data]# awk '{print NR}' test.txt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
•指定行號,與"=="一起使用(下列例如為顯示文本第二行)
[root@WT data]# awk 'NR==2 {print}' test.txt halt:x:7:0:halt:/sbin:/sbin/halt
4、$0的使用
•$0顯示當前的一行
[root@WT data]# awk '{print NR $0}' test.txt 1shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 2halt:x:7:0:halt:/sbin:/sbin/halt 3mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 4operator:x:11:0:operator:/root:/sbin/nologin 5games:x:12:100:games:/usr/games:/sbin/nologin 6ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 7ntp:x:38:38::/etc/ntp:/sbin/nologin 8apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 9tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 10sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 11dbus:x:81:81:System message bus:/:/sbin/nologin 12postfix:x:89:89::/var/spool/postfix:/sbin/nologin 13nobody:x:99:99:Nobody:/:/sbin/nologin 14abrt:x:173:173::/etc/abrt:/sbin/nologin 15systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 16polkitd:x:999:998:User for polkitd:/:/sbin/nologin 17wt:x:1000:1000:wt:/home/wt:/bin/bash 18test2:x:1001:1001::/home/test2:/bin/bash 19
5、-F與$N(N為數字)、$NF的使用
#例子說明:使用-F選項指定分隔符為":"冒號,輸入切割后的$1(第一列)和$NF(最后一列)
1 [root@WT data]# awk -F ":" 'NR==2 {print $0}' test.txt 2 halt:x:7:0:halt:/sbin:/sbin/halt 3 [root@WT data]# awk -F ":" 'NR==2 {print $1,$NF}' test.txt 4 halt /sbin/halt
#例子說明:使用-F選項指定分隔符為" 0/"(空格、數字0、/),取出文件的權限644
1 [root@WT data]# stat test.txt 2 File: ‘test.txt’ 3 Size: 891 Blocks: 8 IO Block: 4096 regular file 4 Device: 802h/2050d Inode: 3407880 Links: 1 5 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) 6 Access: 2018-09-30 19:04:00.755834056 +0800 7 Modify: 2018-09-30 19:03:12.389575356 +0800 8 Change: 2018-09-30 19:03:57.494833754 +0800 9 Birth: - 10 [root@WT data]# stat test.txt |awk -F "[ 0/]" 'NR==4{print $3}' 11 644
6、>=和<=的使用(其他運算法與之相同)
#例子說明:輸出行號大於5的行
[root@WT data]# awk 'NR>=5{print NR,$0}' test.txt 5 games:x:12:100:games:/usr/games:/sbin/nologin 6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 7 ntp:x:38:38::/etc/ntp:/sbin/nologin 8 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 9 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 10 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 11 dbus:x:81:81:System message bus:/:/sbin/nologin 12 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 13 nobody:x:99:99:Nobody:/:/sbin/nologin 14 abrt:x:173:173::/etc/abrt:/sbin/nologin 15 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 17 wt:x:1000:1000:wt:/home/wt:/bin/bash 18 test2:x:1001:1001::/home/test2:/bin/bash 19
#例子說明:輸出行號小於5的行
[root@WT data]# awk 'NR<=5{print NR,$0}' test.txt 1 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 2 halt:x:7:0:halt:/sbin:/sbin/halt 3 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 4 operator:x:11:0:operator:/root:/sbin/nologin 5 games:x:12:100:games:/usr/games:/sbin/nologin
7、&&與||的使用
#例子說明:輸出行號大於5且小於10的行
[root@WT data]# awk 'NR>5 && NR<10 {print NR,$0}' test.txt 6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 7 ntp:x:38:38::/etc/ntp:/sbin/nologin 8 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 9 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
#例子說明:輸出行號小於5或行號大於10的行
[root@WT data]# awk 'NR<5 || NR>10 {print NR,$0}' test.txt 1 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 2 halt:x:7:0:halt:/sbin:/sbin/halt 3 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 4 operator:x:11:0:operator:/root:/sbin/nologin 11 dbus:x:81:81:System message bus:/:/sbin/nologin 12 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 13 nobody:x:99:99:Nobody:/:/sbin/nologin 14 abrt:x:173:173::/etc/abrt:/sbin/nologin 15 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 17 wt:x:1000:1000:wt:/home/wt:/bin/bash 18 test2:x:1001:1001::/home/test2:/bin/bash 19
8、//和~、+的使用
•// 使用正則匹配的格式,//中間放置匹配的內容
•~ 匹配//中防止的內容
•+ 匹配一個或者多個
例子說明:列出/etc/servicesx文件中(http|https|mysql|ssh|telnet|ftp)的端口號,由於/etc/service的文件內容每行有多個空格,所以使用"+"把多個空格和/合並為一個再進行切割。
可以看如下例子加"+"符號與不加"+"所使用的$N的N的數字為多少。
1 [root@WT ~]# awk -F "[ /]" '$1~/^(http|https|ssh)$/{print $0}' /etc/services 2 ssh 22/tcp # The Secure Shell (SSH) Protocol 3 ssh 22/udp # The Secure Shell (SSH) Protocol 4 http 80/tcp www www-http # WorldWideWeb HTTP 5 http 80/udp www www-http # HyperText Transfer Protocol 6 http 80/sctp # HyperText Transfer Protocol 7 https 443/tcp # http protocol over TLS/SSL 8 https 443/udp # http protocol over TLS/SSL 9 https 443/sctp # http protocol over TLS/SSL 10 ssh 22/sctp # SSH 11 [root@WT ~]# awk -F "[ /]" '$1~/^(http|https|ssh)$/{print $1,$14}' /etc/services 12 ssh 22 13 ssh 22 14 http tcp 15 http udp 16 http sctp 17 https 18 https 19 https 20 ssh 22 21 [root@WT ~]# awk -F "[ /]+" '$1~/^(http|https|ssh)$/{print $1,$2}' /etc/services 22 ssh 22 23 ssh 22 24 http 80 25 http 80 26 http 80 27 https 443 28 https 443 29 https 443 30 ssh 22
注意:不加"+"符號,從例子可以看到,雖然通過加大$N的N的數值可以獲取到端口號,但是卻不能使全部需要匹配的服務得到對應的端口號,這是因為-F選項指定的空格分隔符是一個一個匹配,而默認的awk命令是以空格+匹配空格,所以第二個例子指定[空格/]+就可以是所需查詢的服務截取出端口了。
9、if( 條件){ 符合條件之后執行的語句 } else { 條件不成立時執行的語句 } AWK的流程控制語句 注意,如果執行語句不用{ }符號括起來,那么在后面加";"分號
1 [root@WT data]# awk '{if(NR%2==0){print NR,$0} else if(NR==19){print "我是空行"} else{print "我是奇數行"}}' test.txt 2 我是奇數行 3 2 halt:x:7:0:halt:/sbin:/sbin/halt 4 我是奇數行 5 4 operator:x:11:0:operator:/root:/sbin/nologin 6 我是奇數行 7 6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 8 我是奇數行 9 8 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 10 我是奇數行 11 10 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 12 我是奇數行 13 12 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 14 我是奇數行 15 14 abrt:x:173:173::/etc/abrt:/sbin/nologin 16 我是奇數行 17 16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 18 我是奇數行 19 18 test2:x:1001:1001::/home/test2:/bin/bash 20 我是空行 21 [root@WT data]# awk '{if(NR%2==0) print NR,$0; else if(NR==19) print "我是空行";else print "我是奇數行";}' test.txt 22 我是奇數行 23 2 halt:x:7:0:halt:/sbin:/sbin/halt 24 我是奇數行 25 4 operator:x:11:0:operator:/root:/sbin/nologin 26 我是奇數行 27 6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 28 我是奇數行 29 8 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 30 我是奇數行 31 10 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 32 我是奇數行 33 12 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 34 我是奇數行 35 14 abrt:x:173:173::/etc/abrt:/sbin/nologin 36 我是奇數行 37 16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 38 我是奇數行 39 18 test2:x:1001:1001::/home/test2:/bin/bash 40 我是空行
10、BEGIN { 初始化某些變量 } { 根據初始化的變量執行語句 } END { 結束之后執行的語句 }
語句說明:BEGIN和END的作用是給程序賦予初始狀態和在程序結束之后執行一些掃尾的工作。任何在BEGIN之后列出的操作(在{}內)將在awk開始掃描輸入之前執行,而END之后列出的操作將在掃描完全部的輸入之后執行。因此,通常使用BEGIN來顯示變量和預置(初始化)變量,使用END來輸出最終結果。
[root@WT data]# wc -l test.txt 19 test.txt [root@WT data]# awk 'BEGIN{i=1}{i+=1}END{print i}' test.txt 20
12、while循環
例子說明:讓演示文本每行語句輸出兩次
1 [root@WT data]# awk '{i=1;while(i<=2){print $0;i+=1}}' test.txt 2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 3 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 4 halt:x:7:0:halt:/sbin:/sbin/halt 5 halt:x:7:0:halt:/sbin:/sbin/halt 6 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 7 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 8 operator:x:11:0:operator:/root:/sbin/nologin 9 operator:x:11:0:operator:/root:/sbin/nologin 10 games:x:12:100:games:/usr/games:/sbin/nologin 11 games:x:12:100:games:/usr/games:/sbin/nologin 12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 13 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 14 ntp:x:38:38::/etc/ntp:/sbin/nologin 15 ntp:x:38:38::/etc/ntp:/sbin/nologin 16 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 17 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 18 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 19 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 20 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 21 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 22 dbus:x:81:81:System message bus:/:/sbin/nologin 23 dbus:x:81:81:System message bus:/:/sbin/nologin 24 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 25 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 26 nobody:x:99:99:Nobody:/:/sbin/nologin 27 nobody:x:99:99:Nobody:/:/sbin/nologin 28 abrt:x:173:173::/etc/abrt:/sbin/nologin 29 abrt:x:173:173::/etc/abrt:/sbin/nologin 30 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 31 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 32 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 33 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 34 wt:x:1000:1000:wt:/home/wt:/bin/bash 35 wt:x:1000:1000:wt:/home/wt:/bin/bash 36 test2:x:1001:1001::/home/test2:/bin/bash 37 test2:x:1001:1001::/home/test2:/bin/bash
13、do-while循環
1 [root@WT data]# awk '{i=1;do{print $0;i+=1}while(i<1)}' test.txt 2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 3 halt:x:7:0:halt:/sbin:/sbin/halt 4 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 5 operator:x:11:0:operator:/root:/sbin/nologin 6 games:x:12:100:games:/usr/games:/sbin/nologin 7 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 8 ntp:x:38:38::/etc/ntp:/sbin/nologin 9 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 10 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 11 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 12 dbus:x:81:81:System message bus:/:/sbin/nologin 13 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 14 nobody:x:99:99:Nobody:/:/sbin/nologin 15 abrt:x:173:173::/etc/abrt:/sbin/nologin 16 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 17 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 18 wt:x:1000:1000:wt:/home/wt:/bin/bash 19 test2:x:1001:1001::/home/test2:/bin/bash
14、RS的使用
1 [root@WT data]# awk 'BEGIN{RS=":"}{print $0}' test.txt 2 shutdown 3 x 4 6 5 0 6 shutdown 7 /sbin 8 /sbin/shutdown 9 halt 10 x 11 7 12 0 13 halt 14 /sbin 15 /sbin/halt 16 mail 17 x 18 8 19 12 20 mail 21 /var/spool/mail 22 /sbin/nologin 23 operator 24 x 25 11 26 0 27 operator 28 /root 29 /sbin/nologin 30 games 31 x 32 12 33 100 34 games 35 /usr/games 36 /sbin/nologin 37 ftp 38 x 39 14 40 50 41 FTP User 42 /var/ftp 43 /sbin/nologin 44 ntp 45 x 46 38 47 38 48 49 /etc/ntp 50 /sbin/nologin 51 apache 52 x 53 48 54 48 55 Apache 56 /usr/share/httpd 57 /sbin/nologin 58 tss 59 x 60 59 61 59 62 Account used by the trousers package to sandbox the tcsd daemon 63 /dev/null 64 /sbin/nologin 65 sshd 66 x 67 74 68 74 69 Privilege-separated SSH 70 /var/empty/sshd 71 /sbin/nologin 72 dbus 73 x 74 81 75 81 76 System message bus 77 / 78 /sbin/nologin 79 postfix 80 x 81 89 82 89 83 84 /var/spool/postfix 85 /sbin/nologin 86 nobody 87 x 88 99 89 99 90 Nobody 91 / 92 /sbin/nologin 93 abrt 94 x 95 173 96 173 97 98 /etc/abrt 99 /sbin/nologin 100 systemd-network 101 x 102 192 103 192 104 systemd Network Management 105 / 106 /sbin/nologin 107 polkitd 108 x 109 999 110 998 111 User for polkitd 112 / 113 /sbin/nologin 114 wt 115 x 116 1000 117 1000 118 wt 119 /home/wt 120 /bin/bash 121 test2 122 x 123 1001 124 1001 125 126 /home/test2 127 /bin/bash
15、ORS的使用
1 [root@WT data]# cat test.txt 2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 3 halt:x:7:0:halt:/sbin:/sbin/halt 4 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 5 operator:x:11:0:operator:/root:/sbin/nologin 6 games:x:12:100:games:/usr/games:/sbin/nologin 7 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 8 ntp:x:38:38::/etc/ntp:/sbin/nologin 9 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 10 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 11 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 12 dbus:x:81:81:System message bus:/:/sbin/nologin 13 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 14 nobody:x:99:99:Nobody:/:/sbin/nologin 15 abrt:x:173:173::/etc/abrt:/sbin/nologin 16 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 17 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 18 wt:x:1000:1000:wt:/home/wt:/bin/bash 19 test2:x:1001:1001::/home/test2:/bin/bash 20 21 [root@WT data]# awk 'BEGIN{ORS="="}{print $0}' test.txt 22 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown=halt:x:7:0:halt:/sbin:/sbin/halt=mail:x:8:12:mail:/var/spool/mail:/sbin/nologin=operator:x:11:0:operator:/root:/sbin/nologin=games:x:12:100:games:/usr/games:/sbin/nologin=ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin=ntp:x:38:38::/etc/ntp:/sbin/nologin=apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin=tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin=sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin=dbus:x:81:81:System message bus:/:/sbin/nologin=postfix:x:89:89::/var/spool/postfix:/sbin/nologin=nobody:x:99:99:Nobody:/:/sbin/nologin=abrt:x:173:173::/etc/abrt:/sbin/nologin=systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin=polkitd:x:999:998:User for polkitd:/:/sbin/nologin=wt:x:1000:1000:wt:/home/wt:/bin/bash=test2:x:1001:1001::/home/test2:/bin/bash==
16、FS的使用
1 [root@WT data]# awk 'BEGIN{FS=":"}{print $1}' test.txt 2 shutdown 3 halt 4 mail 5 operator 6 games 7 ftp 8 ntp 9 apache 10 tss 11 sshd 12 dbus 13 postfix 14 nobody 15 abrt 16 systemd-network 17 polkitd 18 wt 19 test2
17、OFS的使用
1 [root@WT data]# echo "1 2"|awk 'BEGIN{OFS="&"}{$1=$1;print $0}' 2 1&2
18、for循環的使用
格式:
for(初始表達式;終止條件;步長表達式) {語句}
例子說明:把演示文本的每行語句輸出兩次
1 [root@WT data]# awk '{for(i=0;i<2;i++){print $0}}' test.txt 2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 3 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 4 halt:x:7:0:halt:/sbin:/sbin/halt 5 halt:x:7:0:halt:/sbin:/sbin/halt 6 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 7 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 8 operator:x:11:0:operator:/root:/sbin/nologin 9 operator:x:11:0:operator:/root:/sbin/nologin 10 games:x:12:100:games:/usr/games:/sbin/nologin 11 games:x:12:100:games:/usr/games:/sbin/nologin 12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 13 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 14 ntp:x:38:38::/etc/ntp:/sbin/nologin 15 ntp:x:38:38::/etc/ntp:/sbin/nologin 16 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 17 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 18 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 19 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 20 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 21 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 22 dbus:x:81:81:System message bus:/:/sbin/nologin 23 dbus:x:81:81:System message bus:/:/sbin/nologin 24 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 25 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 26 nobody:x:99:99:Nobody:/:/sbin/nologin 27 nobody:x:99:99:Nobody:/:/sbin/nologin 28 abrt:x:173:173::/etc/abrt:/sbin/nologin 29 abrt:x:173:173::/etc/abrt:/sbin/nologin 30 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 31 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 32 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 33 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 34 wt:x:1000:1000:wt:/home/wt:/bin/bash 35 wt:x:1000:1000:wt:/home/wt:/bin/bash 36 test2:x:1001:1001::/home/test2:/bin/bash 37 test2:x:1001:1001::/home/test2:/bin/bash
19、AWK的數組使用
#awk數組簡單使用
1 [root@WT ~]# awk 'BEGIN{arr[0]="hello world";arr[1]="hello world2";for(i in arr)print arr[i]}' 2 hello world 3 hello world2 4 [root@WT ~]# awk 'BEGIN{arr[0]="hello world";arr[1]="hello world2";for(i=0;i<length(arr);i++)print arr[i]}' 5 hello world 6 hello world2
#統計IP數量
1 [root@WT data]# cat test2.txt 2 10.0.0.5 3 10.0.0.2 4 10.0.0.2 5 10.0.0.1 6 10.0.0.3 7 10.0.0.4 8 10.0.0.5 9 10.0.0.8 10 10.0.0.7 11 10.0.0.4 12 10.0.0.6 13 10.0.0.19 14 10.0.0.1 15 10.0.0.1 16 [root@WT data]# awk '{arr[$1]++} END {for(key in arr) print arr[key],key}' test2.txt |sort -nr 17 3 10.0.0.1 18 2 10.0.0.5 19 2 10.0.0.4 20 2 10.0.0.2 21 1 10.0.0.8 22 1 10.0.0.7 23 1 10.0.0.6 24 1 10.0.0.3 25 1 10.0.0.19
