后文全部 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
说明:表示全部行均被匹配上,并打印第一个字段。