linux 三剑客之------awk

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34646546/article/details/88814496

linux 三剑客之------awk

awk简介

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

awk的工作方式

基本格式 条件+命令
在这里插入图片描述
注: 此图由 无痕有静 提供,更多干货请参阅 https://blog.csdn.net/qq_41112887

参数

项目 Value
-F 修改分隔符(默认分隔符为空格)
-v 修改内置变量
-vOFS 修改输出的分隔符 (把逗号替换为 详见示例)
-vFIELDWIDTHS 修改输出格式 以每列n个字符显示

示例:
-F

[root@alice ~]# awk -F:  '{print $NF}' /etc/passwd
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/syn

-vOFS

# 把$1,$2 中间的逗号 替换为;  不可直接替换所有
[root@alice ~]# awk -F:  -vOFS=";" '{print $1,$2,$3,$4}' /etc/passwd
root;x;0;0
bin;x;1;1
daemon;x;2;2
adm;x;3;4
lp;x;4;7
sync;x;5;

-vFIELDWIDTHS

[root@alice ~]# echo 20190326 |awk -vFIELDWIDTHS="4 2 2" '{print $1,$2,$3}'
2019 03 26


[root@alice ~]# echo 20190326 |awk -vFIELDWIDTHS="4 2 2" -vOFS="-" '{print $1,$2,$3}'
2019-03-26

awk进阶用法

awk倒可乐 替换第一列和最后一列的位置

[root@alice tmp]# awk -F: -vOFS=: '{tmp=$1;$1=$NF;$NF=tmp;print}'  /etc/passwd
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon

显示 文本中花括号内包含 www的行

[root@alice tmp]# cat range.log
www is a linuxer.
device: {
www
no sql
this is log
}
www
[root@alice tmp]# awk '/{/,/}/{if(/www/)print}' range.log 
www

显示文本中包含www的行

[root@alice tmp]# awk '/www/'  range.log 
www is a linuxer.
www
www

匹配文本中第五列是root的行
注 在awk中 所有字母否默认为一个变量 所以此处root需要加双引号

[root@alice tmp]# awk -F: '$5=="root"' /etc/passwd
root:x:0:0:root:/root:/bin/bash

统计日志中每个IP地址使用的流量

[root@alice tmp]# head -n2 access.log 
101.226.61.184 - - [22/Nov/2015:11:02:00 +0800] "GET /mobile/sea-modules/gallery/zepto/1.1.3/zepto.js HTTP/1.1" 200 24662 "http://m.oldboyedu.com.cn/mobile/theme/ppj/home/index.html" "Mozilla/5.0 (Linux; U; Android 5.1.1; zh-cn; HUAWEI CRR-UL00 Build/HUAWEICRR-UL00) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.4 TBS/025478 Mobile Safari/533.1 MicroMessenger/6.3.7.51_rbb7fa12.660 NetType/3gnet Language/zh_CN"
101.226.61.184 - - [22/Nov/2015:11:02:00 +0800] "GET /mobile/theme/ppj/common/js/baiduAnalytics.js HTTP/1.1" 200 526 "http://m.oldboyedu.com.cn/mobile/theme/ppj/home/index.html" "Mozilla/5.0 (Linux; U; Android 5.1.1; zh-cn; HUAWEI CRR-UL00 Build/HUAWEICRR-UL00) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.4 TBS/025478 Mobile Safari/533.1 MicroMessenger/6.3.7.51_rbb7fa12.660 NetType/3gnet Language/zh_CN"
[root@alice tmp]# awk '{sum[$1]=sum[$1]+$10}END{for(i in sum)print sum[i],i}' access.log |sort -rn|head
31362956 114.83.184.139
22431302 117.136.66.10
21466000 116.216.30.47
21464856 223.104.5.197
19145329 116.216.0.60
17219553 114.141.164.180
17121524 114.111.166.22
16911512 223.104.5.202
15969887 116.228.21.187
15255013 112.64.171.98

统计每个IP地址出现的次数

[root@alice tmp]# awk '{sum[$1]=sum[$1]+1}END{for(i in sum)print sum[i],i}' access.log |sort -rn|head
12049 58.220.223.62
10856 112.64.171.98
1982 114.83.184.139
1662 117.136.66.10
1318 115.29.245.13
961 223.104.5.197
957 116.216.0.60
939 180.111.48.14
871 223.104.5.202
869 223.104.4.139

统计系统用户数量

[root@alice tmp]# awk -F: '{if($3==0){i++}else if($3>0 && $3<1000){j++}else if($3>=1000){u++}}END{print "超级管理员有"i"个\n","系统用户有"j"个\n","普通用户有"u"个"}' /etc/passwd
超级管理员有1个
 系统用户有24个
 普通用户有1个

猜你喜欢

转载自blog.csdn.net/qq_34646546/article/details/88814496