python awk 读文件_比较awk python: [文件]web日志信息统计 。 [命令]netstat命令状态统计...

web日志文件统计分析、netstat命令行统计分析

比价awk和python的处理方法

1. web日志内容 ---文件形式

root@h111:/var/log/nginx# cat access.log

192.168.1.3 - - [04/Feb/2018:19:59:42 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36"

192.168.1.3 - - [04/Feb/2018:19:59:43 +0800] "GET /favicon.ico HTTP/1.1" 404 208 "http://192.168.1.111/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36"

192.168.1.3 - - [04/Feb/2018:19:59:54 +0800] "GET /png HTTP/1.1" 404 208 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36"

192.168.1.3 - - [04/Feb/2018:19:59:58 +0800] "GET /a.jpg HTTP/1.1" 404 208 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36"

192.168.1.3 - - [04/Feb/2018:20:06:56 +0800] "GET /a.jpg HTTP/1.1" 404 208 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36"

1.1 用awk处理

其中$7是文件名,$10是大小。 $[$7]+=$10表示 同一个文件名大小累加。awk数组也可以当python字典来理解。

++b[$7] 即同名文件次数累加。

root@h111:/var/log/nginx# awk '{a[$7]+=$10;++b[$7];total+=$10}END{for(x in a)print b[x],x,a[x]}' access.log

1 /png 208

2 /a.jpg 416

1 / 396

1 /favicon.ico 208

1.2 用python处理

这里利用了Counter,不用处理首次为0的赋值可以直接累加。累加方法和awk基本一致。

#/usr/bin/env python3

#author infaaf

from collections import Counter

c=Counter()

s=Counter()

with open('netstat.txt') as f:

for line in f:

key=line.split()[6]

value=line.split()[9]

c[key]+=1

s[key]+=int(value)

print("次数: %s"%c)

print("大小: %s"%s)

for i in c:

print(i.center(30),c[i],s[i])

结果

cb417d4601f380b926ef9560e6e57f07.png

2. tcp状态统计 --- 命令与管道形式

其中tcp6与tcp一起统计

22359ab0b24c8cbe4e5d81715081f728.png

2.1 awk处理

NF表示 number of filed 由于number累计到最后,即表示最后一列。

(awk中 N number F field R row S split ,如RS=row split ,NR= number of row 行号)

root@h111:~# netstat -an | awk '/^tcp/{++s[$NF]}END{for(i in s){print i,s[i]}}'

LISTEN 6

ESTABLISHED 1

2.2 python处理

这里 未使用Counter,判断当key未出现过时,需要手动初始化为1。

这里接收linux stdout 的管道形式,利用了fileinput库

文件net.py

#!/usr/bin/env python3

import fileinput

d={}

for line in fileinput.input():

if line.split()[0].startswith('tcp'):

key=line.split()[5]

if key in d:

d[key]+=1

else:

d[key]=1

print(d)

##默认值方法二,在累加前, d.setdefault(key,0)

服务器上管道调用 net.py

4f2cf92d445050c5f2b3ffc34ebe4598.png

说明: 2种方法实际思想相同,利用(awk数组或python字典) 字典方式

次数:发现相同元素累加1

大小:发现相同元素累加大小

awk胜在短小精悍。复杂情况下,语句复杂。 awk语法复杂,长时间不使用容易忘记。。。

python胜在简单明了。代码稍长,但好维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值