文本三剑客之awk

awk命令的简要处理流程

在这里插入图片描述

awk命令的执行过程

awk 'BEGIN{commands} pattern{commands} END{commands}'files

  • 执行BEGIN {commands}语句块中的语句
  • 从文件或stdin中读取第一行
  • 有无模式匹配,若无则执行{}中的语句
  • 若有则检查该整行与pattern是否匹配,则执行{}中的语句
  • 若不匹配则不执行{}中的语句,接着读取下一行
  • 重复这个过程,直到所有行被读取完毕
  • 执行END{commands}语句块中的语句
[root@kafka3 lianxi]# cat a.txt
山东 aa 2
河南 bb 3
江西 cc 3
山东 bb 10
江西 dd 6
[root@kafka3 lianxi]# cat a.txt | awk '{pro[$1] += $3}END{ for (i in pro) print i,pro[i] }'
河南 3
江西 9
山东 12

NR

NR表示行号,是awk内置的一个变量

number of record —>行号

[root@kafka3 nginx]# w
 13:43:14 up  4:11,  2 users,  load average: 0.08, 0.04, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      09:26    1:44m  0.01s  0.01s -bash
root     pts/1    192.1x8.1x1.1    11:59    2.00s  3.82s  0.00s w
[root@kafka3 nginx]# w|awk '{print $3}'
4:11,
FROM
09:26
192.168.171.1
[root@kafka3 nginx]# w|awk 'NR>=3 {print $3}'
09:26
192.168.171.1
[root@kafka3 nginx]# 

输出分割符和输入分割符

OFS输出分隔符

FS输入分割符,也可以用-F表示

[root@kafka3 /]# awk  'BEGIN{FS=":"}OFS="#"{print $1,$3}' /etc/passwd
root#0
bin#1
daemon#2
adm#3
lp#4
sync#5
shutdown#6

案例

[root@kafka3 /]# ps aux | awk '$3 >0.1 || $4 >0.1 {print $2,$11 }' 
1 /usr/lib/systemd/systemd
709 /usr/bin/VGAuthService
710 /usr/bin/vmtoolsd
711 /usr/lib/polkit-1/polkitd
725 /usr/sbin/NetworkManager
1001 /usr/bin/python2
[root@kafka3 /]# watch -n 2 -d "ifconfig|awk 'NR==5{print $5}'"
#显示每隔两秒显示的流量变化

awk命令引用shell变量

-v引入shell变量

#!/bin/bash
name=haha
echo | awk '{print $name}'


#!/bin/bash
name=haha
echo |awk -v abc=$name '{print abc}'

awk的几个内置函数

length函数,统计长度

[root@kafka3 ~]# awk -F: 'length($1)>=5&&length($1)<=10&&$3>500&&/bash$/{print NR,$1,$7}' /etc/passwd
27 sanle1 /bin/bash
34 yanding /bin/bash
37 luyunchao /bin/bash
38 xiayixing /bin/bash
43 zhaoliying /bin/bash

split函数,切割出来存放到一个数组里,下标从1开始

[root@kafka3 ~]# awk -F: 'length($1)>=5&&length($1)<=10&&$3>500&&/bash$/{split($7,s,"/");print NR,$1,s[1],s[2],s[3]}' /etc/passwd
27 sanle1  bin bash
34 yuanding  bin bash
37 luyunchao  bin bash
38 xiayixing  bin bash
43 zhaoliying  bin bash

substr函数,一个切片操作,substr($1,1,4)

[root@kafka3 ~]# awk -F: 'length($1)>=5&&length($1)<=10&&$3>500&&/bash$/{split($7,s,"/");print NR,substr($1,1,4),s[1],s[2],s[3]}' /etc/passwd
27 sanl  bin bash
34 yuan  bin bash
37 liuy  bin bash
38 xiay  bin bash
43 zhao  bin bash

流控

if语句

[root@kafka3 ~]# ifconfig | awk 'NR==4||NR==6{if($1 == "RX")print "接受的流量:"$5;else print "发送的流量:"$5}'
接受的流量:1116716
发送的流量:42797852

数组

awk里如何使用数组来存放数据?

1.将所有/etc/passwd所有的用户存放在user数组里

[root@kafka~]# cat /etc/passwd|awk -F :'{user[$1]=$3}

将$3里的值赋值给user[$1]数组,$1其实就是/etc/passwd里的用户名

将用户和用户对应的uid将其关联,用户名做些表关键字,uid做数组元素对应的值

awk里如何取出数组里存放的数据?

2.将user数组的值全部取出来

[root@kafka3 ~]# cat /etc/passwd|awk -F: ‘{user[$1]=$3}END{for (i in user)print i,user[i]}’

[root@kafka3 ~]# cat /etc/passwd|awk -F: '{user[$1]=$3}END{for (i in user)print i,user[i]}'
adm 3
yuanding 2011
wyy 2016

案例

[root@kafka3 lianxi]# cat a.txt
山东 aa 2
河南 bb 3
江西 cc 3
湖南 aa 40
山东 bb 10
江西 dd 6
河北 cc 3
湖南 cc 3
[root@kafka3 lianxi]# cat a.txt|awk '{b[$1]+=$3}END{for (i in b)print i,b[i]}'|sort -k2 -n
河北 3
河南 3
江西 9
山东 12
湖南 43
[root@kafka3 lianxi]# 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值