一、前言
Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。
- 很多 shell 脚本处理不了或者处理不方便的事情 python 可以干
- python代码简单,配置简单,各种开源库多
- 效率高,性价比高
二、下载安装
2.1 解压缩
1)xz
xz 是一个使用 LZMA 压缩算法的无损数据压缩文件格式(压缩率很高)
xz -d 文件.xz # 解压缩
xz -z 文件 # 强制压缩
2)tar
tar zcvf 文件.tar.gz # 打包文件夹或文件 tar zxvf 文件.tar.gz # 解压
文件后缀如果没有.gz 则代表没有使用 gzip 压缩,只需去掉 tar 命令的参数 z
2.2 安装
进入 Python 源码目录:
./Configure
脚本 Configure 用来生成 makefile,它本身是由 autoconf 软件生成的
make && make install
编译和安装
2.3 第一个 Python 程序
1 #! /usr/bin/python 2 import sys 3 print('---'+sys.platform+'---') 4 print('please input your name: ') 5 get_str = sys.stdin.readline() 6 print('hello,'+get_str)
第一行:代表该文件由 python 解释执行
第二行:代表引入系统相关的信息模块 sys
第三行:代表输出运行的操作系统环境
第五行:代表从标准输入读一行
执行结果:
三、相关工具
3.1 ln 命令
ln 命令用来为文件创件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。最常见的参数是 -s(类似 windows 的快捷方式)。
1)基本语法
ln [选项] 源文件 目标文件
2)选项
- -b 或 --backup:删除,覆盖目标文件之前的备份
- -d 或 -F 或 --directory:建立目录的硬连接
- -f 或 --force:强行建立文件或目录的连接,不论文件或目录是否存在
- -i 或 --interactive:覆盖既有文件之前先询问用户
- -n 或 --no-dereference:把符号连接的目的目录视为一般文件
- -s 或 --symbolic:对源文件建立符号连接,而非硬连接
- -S <字尾备份字符串> 或 --suffix=<字尾备份字符串>:用 -b 参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字符串是符号 ~,用户可通过 -S 参数来改变它
- -v 或 --verbose:显示指令执行过程
- -V <备份方式> 或 --version-control=<备份方式>:用 -b 参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用 -S 参数变更,当使用 -V 参数<备份方式>指定不同备份方式时,也会产生不同字尾的备份字符串
- --help:在线帮助
- --version:显示版本信息
3)实例
把 /etc/httpd/logs/access_log 文件创建快捷方式到 ~/httpd_log
ln -s /etc/httpd/logs/access_log ~/httpd_log
3.2 wc 命令
wc 命令用来计算文件的 Byte 数、字符数或是列数,若不指定文件名称,或是所给予的文件名为 - ,则 wc 指令会从标准输入设备读取数据。
1)基本语法
wc [选项] 文件
2)选项
- -c:统计字节数
- -l:统计行数
- -m:统计字符数。这个标志不能与 -c 标志一起使用
- -w:统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串
- -L:打印最长行的长度
- -help:显示帮助信息
- --version:显示版本信息
3.3 awk 命令
awk 是一个强大的文本分析工具,相对于 grep 的查找,sed 的编辑,awk 在其对数据分析并生成报告时,显得尤为强大。简单来说 awk 就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
它被定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
1)基本语法
awk [选项] '{pattern + action}' {filenames}
awk [选项] -f awk-scriptfile filenames
2)选项
- -F fs or --field-separator fs
指定输入文件折分隔符,fs 是一个字符串或者是一个正则表达式,如 -F : - -v var=value or --asign var=value
赋值一个用户定义变量 - -f scripfile or --file scriptfile
从脚本文件中读取awk命令 - -mf nnn and -mr nnn
对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用 - -W compact or --compat, -W traditional or --traditional
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略 - -W copyleft or --copyleft, -W copyright or --copyright
打印简短的版权信息 - -W help or --help, -W usage or --usage
打印全部awk选项和每个选项的简短说明 - -W lint or --lint
打印不能向传统unix平台移植的结构的警告 - -W lint-old or --lint-old
打印关于不能向传统unix平台移植的结构的警告 - -W posix
打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效 - -W re-interval or --re-inerval
允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]] - -W source program-text or --source program-text
使用program-text作为源代码,可与-f命令混用 - -W version or --version
打印bug报告信息的版本
3)实例
access_log 文件每行按空格或 TAB 分割,输出文本中的1、7项:
cat access_log | awk '{print $1,$7}'
4)参考
《Linux:awk命令详解》:https://zhangge.net/1939.html
3.4 sort 命令
sort 命令将文本文件内容以行为单位来排序,并将排序结果标准输出。sort 命令既可以从特定的文件,也可以从 stdin 中获取输入。
1)基本语法
sort [选项] filename
2)选项
- -b:忽略每行前面开始出的空格字符
- -c:检查文件是否已经按照顺序排序
- -d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符
- -f:排序时,将小写字母视为大写字母
- -i:排序时,除了040至176之间的 ASCII 字符外,忽略其他的字符
- -m:将几个排序号的文件进行合并
- -M:将前面3个字母依照月份的缩写进行排序
- -n:依照数值的大小排序
- -o <输出文件>:将排序后的结果存入制定的文件
- -r:以相反的顺序(倒序)来排序
- -t <分隔字符>:指定排序时所用的栏位分隔字符
- + <起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位
- -u:在输出行中去除重复行
3.5 uniq 命令
uniq 命令去除排序后文件中的重复行,因此 uniq 经常和 sort 结合使用(所有的重复行必须是相邻的)。
1)基本语法
uniq [选项] 输入文件 [输出文件]
输入文件:指定要去除的重复行文件。如果不指定此项,则从标准读取数据
输出文件:指定要去除重复行后的内容要写入的输出文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)
2)选项
- -c 或 --count:在每列旁边显示该行重复出现的次数
- -d 或 --repeated:仅显示重复出现的行列
- -f <栏位> 或 --skip-fields=<栏位>:忽略比较指定的栏位
- -s <字符位置> 或 --skip-chars=<字符位置>:忽略比较指定的字符
- -u 或 --unique:仅显示出一次的行列
- -w <字符位置> 或 --check-chars=<字符位置>:指定要比较的字符
四、Python 模拟访问网站
» p1.py
import urllib.request def jumpto(): response = urllib.request.urlopen('http://180.76.232.93/index.html') html = response.read() print(html) # 请求5次 for i in range(5): jumpto()
执行结果:
五、Shell 分析
5.1 查看连接数
netstat 查看 80 端口的连接数(TIME_WAIT 状态):
netstat -apt | grep "TIME_WAIT" | grep ":http" | wc -l
执行结果:
5.2 分析 apache 日志
1)查看日志
apache 日志文件默认位置为:/etc/httpd/logs
cat /etc/httpd/logs/access_log
执行结果类似:
2)查看总记录数
wc -l /etc/httpd/logs/access_log
执行结果类似:
3)统计去重后倒排序的 ip 访问次数
cat access_log | awk '{print $1}' | sort | uniq -c | sort -nr
执行结果类似:
六、Python 分析
python 读取 access_log 日志并倒排序统计访问次数最多的 ip。
» p2.py
# coding=utf-8 ip_list={} file=open('access_log',mode='r') try: # lines=file.readlines() # print(len(lines)) # 读取一行数据 line=file.readline() while line: # 按空格分割一行数据 line_sp=line.split(' ') if len(line_sp)>3: # 该ip已经存在则将其出现次数+1 if line_sp[0] in ip_list: ip_list[line_sp[0]] = ip_list[line_sp[0]] + 1 # 该ip首次出现则初始化其出现次数为1 else: ip_list[line_sp[0]] = 1 # 继续读取一行数据 line=file.readline() # 按照ip出现的次数排序 ip_list_sort=sorted(ip_list.items(),key=lambda v:v[1],reverse=True) # 最终输出 print(ip_list_sort) except Exception as e: print(e) finally: file.close()
执行结果类似: