5.匹配运算
[root@www ~]# awk -F ':' '$1 ~ "^ro" {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@www ~]# awk -F ':' '$1 !~ "^ro" {print $0}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
mysql:x:997:995::/home/mysql:/sbin/nologin
www:x:996:994::/home/www:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
zabbix:x:995:993:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin
grafana:x:993:992:grafana user:/usr/share/grafana:/sbin/nologin
3.3)awk 环境变量
变量描述
FIELDWIDTHS以空格分隔的数字列表,用空格定义每个数据字段的精确宽度
FS输入字段分隔符号
OFS输出字段分隔符号
RS输入记录分隔符
ORS输出记录分隔符号
FIELDWIDTHS:重定义列宽并打印,注意不可以使用$0打印所有,因为$0是打印本行全内容,不会打印你定义的字段
[root@www ~]# awk 'BEGIN{FIELDWIDTHS="5 2 8"}NR==1{print $1,$2,$3}' /etc/passwd
root: x: 0:0:root
FS:指定数据源中字段分隔符,类似命令选项-F
[root@www ~]# awk 'BEGIN{FS=":"}NR==1{print $1,$3,$NF}' /etc/passwd
root 0 /bin/bash
OFS:指定输出到屏幕后字段的分隔符
[root@www ~]# awk 'BEGIN{FS=":";OFS="-"}NR==1{print $1,$3,$NF}' /etc/passwd
root-0-/bin/bash
RS:指定记录的分隔符
[root@www ~]# awk 'BEGIN{RS=""}{print $1,$13,$25,$37,$49}' test
1 2 3 4 5
将记录的分隔符修改为空行后,所有的行会变成一行,所以所有字段就在一行了。
ORS:输出到屏幕后记录的分隔符,默认为回车
[root@www ~]# awk 'BEGIN{RS="";ORS="*"}{print $1,$13,$25,$37,$49}' test
1 2 3 4 5*[root@www ~]#
可以看出,提示符和输出在一行了,因为默认回车换成了*
3.4)流程控制
if判断语句
for循环语句
while循环语句
do...while语句
循环控制
if判断语句
学习用例
[root@www ~]# cat num
1
2
3
4
5
6
7
8
9
单if语句
打印$1大于5的行
[root@www ~]# awk '{if($1>5)print $0}' num
6
7
8
9
if...else语句
假如$1大于5则除以2输出,否则乘以2输出
[root@www ~]# awk '{if($1>5)print $1/2;else print $1*2}' num
2
4
6
8
10
3
3.5
4
4.5
for循环语句
学习用例
[root@www ~]# cat num2
60 50 100
150 30 10
70 100 40
将一行中的数据都加起来 $1+$2+$3
[root@www ~]# awk '{sum=0;for (i=1;i<4;i++){sum+=$i}print sum}' num2
210
190
210
如果看的不明白可以看下面格式
[root@www ~]# awk '{
> sum=0
> for (i=1;i<4;i++) {
> sum+=$i
> }
> print sum
> }' num2
210
190
210
while循环语句
先判断后执行
学习用例
[root@www ~]# cat num2
60 50 100
150 30 10
70 100 40
将文件中的每行的数值累加,和大于或等于150就停止累加
[root@www ~]# awk '{sum=0;i=1;while(sum<150){sum+=$i;i++}print sum}' num2
210
150
170
如果看的不明白可以看下面格式
[root@www ~]# awk '{
sum=0
i=1
while (sum<150) {
sum+=$i
i++
}
print sum
}' num2
210
150
170
do...while循环语句
先执行后判断
学习用例
[root@www ~]# cat num2
60 50 100
150 30 10
70 100 40
将文件中的每行的数值累加,和大于或等于150就停止累加
[root@www ~]# awk '{sum=0;i=1;do{sum+=$i;i++}while(sum<150);print sum}' num2
210
150
170
如果看的不明白可以看下面格式
[root@www ~]# awk '{
> sum=0
> i=1
> do {
> sum+=$i
> i++
> }while (sum<150)
> print sum
> }' num2
210
150
170
循环控制语句
break 跳出循环,继续执行后续语句
学习用例
[root@www ~]# cat num2
60 50 100
150 30 10
70 100 40
累加每行数值,和大于150停止累加
[root@www ~]# awk '{
> sum=0
> i=1
> while (i<4){
> sum+=$i
> if (sum>150){
> break
> }
> i++
> }
> print sum
> }' num2
210
180
170
四、awk小技巧
学习用例
[root@www ~]# cat test
1 the quick brown fox jumps over the lazy cat . dog
2 the quick brown fox jumps over the lazy cat . dog
3 the quick brown fox jumps over the lazy cat . dog
4 the quick brown fox jumps over the lazy cat . dog
5 the quick brown fox jumps over the lazy cat . dog
打印test文本的行数
[root@www ~]# awk 'END{print NR}' test
5
打印test文本最后一行内容
[root@www ~]# awk 'END{print $0}' test
5 the quick brown fox jumps over the lazy cat . dog
打印test文本列数
[root@www ~]# awk 'END{print NF}' test
12
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2730/viewspace-3120744/ ,如需转载,请注明出处,否则将追究法律责任。