後文全部 awk 語句中出現的 file.txt
內容均以下:html
[root@nginx01 ~]# cat file.txt 1 1 root:x:0:0:root:/root:/bin/bash 2 1 root:x:0:0:root:/root:/bin/bash 3 2 bin:x:1:1:bin:/bin:/sbin/nologin 4 2 bin:x:1:1:bin:/bin:/sbin/nologin 5 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 6 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 7 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
• Regexp Patterns: Using regexps as patterns.
• Expression Patterns: Any expression can be used as a pattern.
• Ranges: Pairs of patterns specify record ranges.
• BEGIN/END: Specifying initialization and cleanup rules.
control.
• Empty: The empty pattern, which matches every record.nginx
咱們針對幾個經常使用的模式介紹下:express
正則匹配模式,語法:bash
/regular expression/
示例:app
[root@nginx01 ~]# awk '/root|foo|daemon|bar/' file.txt 1 1 root:x:0:0:root:/root:/bin/bash 2 1 root:x:0:0:root:/root:/bin/bash 5 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
說明:ide
root|foo|daemon|bar
四個字符串中任意字符串的行。$0
,即表示打印匹配行。此模式至關於
$0 ~ /pattern/
;測試
全部的 awk 表達式均可經過此模式來匹配,其實就是關係運算。code
經常使用的運算單元以下:regexp
運算單元 | 表明意義 |
---|---|
> | 大於 |
< | 小於 |
>= | 大於或等於 |
<= | 小於或等於 |
== | 等於 |
!= | 不等於 |
~ | match |
!~ | not match |
廢放少說,直接上示例:
# 若是 $1 等於 3,則打印匹配行 [root@nginx01 ~]# awk '$1 == 3' file.txt 3 2 bin:x:1:1:bin:/bin:/sbin/nologin # 若是 $NF 包含 root 字符串,則打印匹配行 [root@nginx01 ~]# awk '$NF ~ /root/' file.txt 1 1 root:x:0:0:root:/root:/bin/bash 2 1 root:x:0:0:root:/root:/bin/bash # 若是同時包含 bash 和 root 字符串,則打印對應行 [root@nginx01 ~]# awk '/bash/ && /root/' file.txt 1 1 root:x:0:0:root:/root:/bin/bash 2 1 root:x:0:0:root:/root:/bin/bash # 若是 $1 不大於 1,則打印對應行(方便測試取反,實際環境直接寫成 $1 <= 1 便可) [root@nginx01 ~]# awk '!($1 > 1)' file.txt 1 root:x:0:0:root:/root:/bin/bash [root@nginx01 ~]#
範圍模式由兩個模式組成,以逗號分隔,形式爲 「begpat, endpat」。它用於匹配連續輸入記錄的範圍。第一個模式 begpat 控制範圍的開始位置,而 endpat 控制模式的結束位置。
語法:
示例一:按行讀取文本,打印 $2 等於 1,$2 等於 2 之間的全部行(第一次出現就匹配,幷包含匹配行)。
[root@nginx01 ~]# awk '$2==1,$2==2' file.txt 1 1 root:x:0:0:root:/root:/bin/bash 2 1 root:x:0:0:root:/root:/bin/bash 3 2 bin:x:1:1:bin:/bin:/sbin/nologin
示例二:打印字符串 daemon 和字符串 adm 之間的全部行,幷包含匹配行自己。
[root@nginx01 ~]# awk '/daemon/,/adm/' file.txt 5 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 6 4 adm:x:3:4:adm:/var/adm:/sbin/nologin
示例三:打印除開在字符串 daemon 和字符串 adm 之間行的全部行。
[root@nginx01 ~]# awk '/daemon/,/adm/ {next} {print}' file.txt 1 1 root:x:0:0:root:/root:/bin/bash 2 1 root:x:0:0:root:/root:/bin/bash 3 2 bin:x:1:1:bin:/bin:/sbin/nologin 4 2 bin:x:1:1:bin:/bin:/sbin/nologin 7 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
BEGIN 規則只執行一次,在讀取文件數據行以前就開始執行。一樣,END 規則在讀取全部文件數據行以後執行一次。
BEGIN 成立(其值爲 true )時:
[root@nginx01 ~]# awk 'BEGIN {print "LINE NUM USERINFO"} {print $1,$2,$3}' file.txt LINE NUM USERINFO 1 1 root:x:0:0:root:/root:/bin/bash 2 1 root:x:0:0:root:/root:/bin/bash 3 2 bin:x:1:1:bin:/bin:/sbin/nologin 4 2 bin:x:1:1:bin:/bin:/sbin/nologin 5 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 6 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 7 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
有些 awk 程序甚至"不須要讀入任何數據行"。這狀況可把整個程序置於以 BEGIN 爲 Pattern 的 Actions 中。
例如 :
[root@nginx01 ~]# awk 'BEGIN { print " Hello, the Word ! " }' Hello, the Word !
執行該類僅含 BEGIN { Actions } 的程序時, awk 並不會開啓任何數據文件進行處理.
END 成立(其值爲true)的時機與 BEGIN 剛好相反, 爲:
無論該數據有多少行, 該 Actions 僅被執行一次.
示例:
[root@nginx01 ~]# awk '{print $1,$2,$3} END {print "done"}' file.txt 1 1 root:x:0:0:root:/root:/bin/bash 2 1 root:x:0:0:root:/root:/bin/bash 3 2 bin:x:1:1:bin:/bin:/sbin/nologin 4 2 bin:x:1:1:bin:/bin:/sbin/nologin 5 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 6 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 7 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin done
BEGIN/END 內容摘自互聯網,原文連接遺失。
咱們再來看一個官網示例:
$ awk ' > BEGIN { print "Analysis of \"li\"" } > /li/ { ++n } > END { print "\"li\" appears in", n, "records." }' mail-list -| Analysis of "li" -| "li" appears in 4 records.
說明:
Analysis of "li"
。"li" appears in 4 records.
,變量 n 等於 4。空模式最爲簡單,表示匹配全部數據行。
示例:
awk '{print $1}' file.txt
說明:表示全部行均被匹配上,並打印第一個字段。