Shell正则三剑客 | awk命令

AWK命令

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中不适用;

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小练习

打印行号【awk/grep实现】

## 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

匹配包含 root 的行【awk/grep实现】

## 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的行

[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

匹配包含root 或 bash 的行【awk/grep实现】

## 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区别

  • 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

awk的条件判断使用

## 判断,如果$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

awk的循环

## 求和 文件所有第3列	
[root@ansible-master awk]# awk -F ":" '{(tot=tot+$3)}; END {print tot}' text 	
4707

更多awk用法可参考:http://man.linuxde.net/awk

你可能感兴趣的:(Shell正则三剑客 | awk命令)