awk 模式之正則/關係運算/範圍模式/BEGIN/END/空模式

本文示例文本內容

後文全部 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

Pattern Elements

• 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

gawk manual pattern elements正則表達式

咱們針對幾個經常使用的模式介紹下:express

Regular Expressions as Patterns

正則匹配模式,語法: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

  • 經過正則表達式,先過濾出 file.txst 文件包含 root|foo|daemon|bar 四個字符串中任意字符串的行。
  • 動做爲空,默認表示 $0,即表示打印匹配行。

此模式至關於 $0 ~ /pattern/測試

Expressions as Patterns

全部的 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 ~]#

Specifying Record Ranges with Patterns

範圍模式由兩個模式組成,以逗號分隔,形式爲 「begpat, endpat」。它用於匹配連續輸入記錄的範圍。第一個模式 begpat 控制範圍的開始位置,而 endpat 控制模式的結束位置。

語法:

  • awk '$1 == "on", $1 == "off"' myfile
  • /Pattern1/,/Pattern2/

示例一:按行讀取文本,打印 $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 規則只執行一次,在讀取文件數據行以前就開始執行。一樣,END 規則在讀取全部文件數據行以後執行一次。

BEGIN

BEGIN 成立(其值爲 true )時:

  • awk 程序一開始執行, 還沒有讀取任何數據以前。在 BEGIN { Actions } 語法中, 其 Actions 部份僅於程序一開始執行時被執行一次.
  • 當 awk 從數據文件讀入數據行後, BEGIN 便再也不成立, 故不論有多少數據行, 該 Actions 部份僅被執行 一次.
  • 通常常把 "與數據文件內容無關" 與 "只需執行ㄧ次" 的部分置於該 Actions (以 BEGIN 爲 Pattern)中.
    [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

END 成立(其值爲true)的時機與 BEGIN 剛好相反, 爲:

  • awk 處理完全部數據, 即將離開程序時執行
  • 讀入數據行時, END 並不成立, 故其對應的 Actions 並不被執行; 惟有當 awk 讀完全部數據時, 該 Actions 纔會被執行。

無論該數據有多少行, 該 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.

說明:

  • awk 程序開始執行,在未讀取任何數據行以前,執行了 BEGIN 的 Actions,即打印 Analysis of "li"
  • BEGIN 執行完成後,開始讀取文件 mail-list,若是模式匹配到字符串 「li」 則執行動做對變量 n 進行累加。
  • 文件數據行所有讀取完以後,則開始執行 END Actions,也就是打印 "li" appears in 4 records. ,變量 n 等於 4。

The Empty Pattern

空模式最爲簡單,表示匹配全部數據行。

示例:

awk '{print $1}' file.txt

說明:表示全部行均被匹配上,並打印第一個字段。

相關文章
相關標籤/搜索