awk 具有 grep 和 sed命令的特性,同时 AWK针对列进行匹配
Usage: awk [options] -f progfile [--] file ...
Usage: awk [options] [--] 'program' file ...
-F fs
fs指定输入分隔符,fs可以是字符串或正则表达式;如-F ":"
-vvar=value
赋值一个用户定义变量,将外部变量传递给awk
-f progfile
从脚本文件中读取awk命令
-m[fr]val
对val值设置内在限制;
-mf选项
限制分配给val的最大块数目;
-mr选项
限制记录最大数目;
此选项为awk的扩展功能,在标准awk中不适用;
## $1 $2...$n 表示字段;$0 表示所有字段
head -n2 test.txt | awk -F ":" '{print $0}'
head -n2 test.txt | awk -F ":" '{print $1}'
## 输入字段分隔符
head -n2 test.txt | awk -F ":" '{print $1"#"$2"#"$3}'
head -n2 test.txt | awk -F ":" '{OFS="#"}{print $1,$2,$3}'
## 字符串过滤【具有grep过滤功能】
awk -F ":" '/root/' test.txt ## 匹配字符串为root的行
awk -F ":" '$1 ~/root/' test.txt ## 匹配第一字段包含root的行
## awk的数学运算
awk -F ":" '$3>$4' /etc/passwd
awk -F ":" '$3>800 || $7=="/bin/bash"' /etc/passwd
awk -F ":" '$7!="/sbin/nologin"' /etc/passwd
## if判断用例
awk -F ":" '{if($1=="root"){print $0} }' text
awk -F ":" '{if($3>=20){print $3}}' text
## awk的循环
awk -F ":" '{(tot=tot+$3)}; END {print tot}' text
## awk写法
[root@shell awk]# awk -F ":" '/root/{print NR":"$0}' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
## grep写法
[root@shell awk]# grep -n 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
## awk写法
[root@shell awk]# awk -F ":" '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
## grep写法
[root@shell awk]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@shell awk]# awk -F ":" '$1 ~/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
rootaaaaa:x:0:0:root:/root:/bin/bash
irootaaaaa:x:0:0:root:/root:/bin/bash
## awk写法(一)
[root@shell awk]# awk -F ":" '/root|bash/ {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
## awk写法(二)
[root@shell awk]# awk -F ":" '/root/ || /bash/ {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
## grep写法
[root@shell awk]# grep -E "root|bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
## 匹配 $3等于字符串0
[root@shell awk]# awk -F ":" '$3=="0"' /etc/passwd
root:x:0:0:root:/root:/bin/bash
## 匹配 $3 大于等于字符串 10
[root@ansible-master awk]# head -n 5 text |awk -F ":" '$3>="10"'
rootaaaaa:x:10:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
## 匹配 $3 大于等于数字 10
[root@ansible-master awk]# head -n 5 text |awk -F ":" '$3>=10'
rootaaaaa:x:10:0:root:/root:/bin/bash
## 匹配$7字段 不等于字符串·/bin/nologin·
[root@ansible-master awk]# head -n 5 text |awk -F ":" '$7!="/bin/nologin"'
root:x:0:0:root:/root:/bin/bash
rootaaaaa:x:10:0:root:/root:/bin/bash
irootaaaaa:x:01:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
## 方法1
[root@shell awk]# awk -F ":" '{OFS="#"} /root|bash/ {print $1,$2,$5}' /etc/passwd
root#x#root
operator#x#operator
## 方法2
[root@shell awk]# awk -F ":" '/root|bash/ {print $1"#"$2"#"$5}' /etc/passwd
root#x#root
operator#x#operator
[root@shell awk]# awk -F ":" '{OFS="#"}{if($3>800){print $1,$3,$7}}' /etc/passwd
polkitd#999#/sbin/nologin
chrony#998#/sbin/nologin
jenkins#997#/bin/false
saslauth#996#/sbin/nologin
NR 表示,只打印行号
$NR 表示,根据当前行号打印相应字段(比如:第1行,打印 $1字段;第2行,打印$2字段)
## NR 表示,只打印行号
[root@ansible-master awk]# head -6 text | awk -F ":" '{print NR, $0}'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
## 匹配NR 大于 20 的行
[root@ansible-master awk]# awk -F ":" 'NR>20 {print NR,$0}' text
21 chrony:x:998:996::/var/lib/chrony:/sbin/nologin
22 jenkins:x:997:993:Jenkins Automation Server:/var/lib/jenkins:/bin/false
23 saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin
24 mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
25 smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
## $NR 表示,根据当前行号打印相应的字段
[root@ansible-master awk]# head -6 text | awk -F ":" '{print $NR, $0}'
root root:x:0:0:root:/root:/bin/bash
x bin:x:1:1:bin:/bin:/sbin/nologin
2 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
lp lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
/sbin sync:x:5:0:sync:/sbin:/bin/sync
## 判断,如果$1字段 等于 字符串root 则打印
[root@ansible-master awk]# awk -F ":" '{if($1=="root"){print $0} }' text
root:x:0:0:root:/root:/bin/bash
## 判断,如果$3字段 大于 数字20 则打印
[root@ansible-master awk]# awk -F ":" '{if($3>=20){print $3}}' text
99
192
81
999
## 求和 文件所有第3列
[root@ansible-master awk]# awk -F ":" '{(tot=tot+$3)}; END {print tot}' text
4707
更多awk用法可参考:http://man.linuxde.net/awk