Linux三劍客之awk命令詳解


一、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個以上
// 正則匹配符
print 輸出、打印

三、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

啟動兼容模式;將有如下限制:
<1>無法識別\x
<2>當FS被設置為單個空間時,只有空格和Tab充當字段分隔符,換行符不被設置為分隔符
<3>之后行不能有?和:
<4>關鍵字函數的同義詞FUNC不被識別
<5>運算符**和**=不能代替^和^=

-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 我是空行
View Code

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
View Code

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
View Code

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
View Code

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==
View Code

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
View Code

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
View Code

 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
View Code

 


免責聲明!

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



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