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

说明:表示全部行均被匹配上,并打印第一个字段。

相关文章
相关标签/搜索