AWK的模式
语法:awk [-F] 'pattern {action}' input_filename1 input_filename2 ……
对上述代码进行解释:
- (1)-F为字段分隔符。若不指定,awk默认使用空格作为分隔符。
- (2)/pattern/和/action/需要使用单引号引起来,防止shell做解释。
- (3)/pattern/是可选项,如果不指定awk将处理输入文件中的所有记录,如果指定一个模式,awk则只处理匹配到的模式的记录。
- (4){action}为awk的命令,可以是单个命令,也可以是多个命令,整个action(包括里面的所有命令)都必须放在{ }之间。
- (5)input_filename表示要处理的文件。
- (6)action必须被{ }包裹,没有被包裹的就是pattern,awk可以接受许多不同形态的pattern,一般常用“关系表达式”来当成pattern,awk通过判断pattern的值来决定是否执行其后所对应的action。
1.常见的模式类型
- (1)regexp:正则表达式,格式为/regular expression/。
- (2)expression:表达式,其值非0或非空字符时满足条件,如:$1 ~ /foo/ 或 $1 == “uplook”,用运算符~ (匹配)和 !~(不匹配)。
- (3)ranges:指定的匹配范围,格式为pat1,pat2。
- (4)BEGIN/END:特殊模式,仅在awk命令执行前运行一次货结束前运行一次。
- (5)Empty(空模式):匹配任意输入行
2.常见的action - 1.expressions
- 2.control statements
- 3.compound satements
- 4.input statements
- 5.output satements
-
- 2.1 /正则表达式/:使用通配符的扩展集。
- +:匹配其前的单个字符一次以上,是awk自有的元字符,不适用于grep和sed等
- ?:匹配其前的单个字符1次或0次,是awk自有的元字符,不适用于grep和sed等
- 2.1 /正则表达式/:使用通配符的扩展集。
-
- 2.2关系表达式
- 可以是运算表达式,可以是字符串或数字的比较,如$2>$1选择一个第二个字段比第一个字段长的行。
-
- 2.3模式匹配表达式
- BEGIN:让用户指定在第一条输入记录被处理之前所发生的的动作,通常在此设置全局变量,在处理文本之前开始执行对应的命令,执行完BEGIN命令之后,才会遍历对应文本中的数据。
- END:让用户在最后一条输入记录被读取之后发生的动作,处理完END后,才会执行对应的命令。
用一些简单的案例解释awk模式:
- 1.使用正则:
[root@bogon ~]# awk -F: '/^r/ {print $1,$3}' /etc/passwd
root 0
rngd 992
- 2.使用BEGIN
[root@bogon ~]# awk -F: 'BEGIN {printf "%-15s %-3s %-15s\n","user","uid","shell"} $3==0,$7~"nologin" {printf "%-15s %-3s %-15s\n",$1,$3,$7}' /etc/passwd
user uid shell
root 0 /bin/bash
bin 1 /sbin/nologin
- 3.使用END
[root@bogon ~]# awk -F: 'BEGIN {printf "%-15s %-3s %-15s\n","user","uid","shell"} $3==0,$7~"nologin" {printf "%-15s %-3s %-15s\n",$1,$3,$7} END {print "------END------"}' /etc/passwd
user uid shell
root 0 /bin/bash
bin 1 /sbin/nologin
------END------