CentOS初步学习记录(八)Python + Shell

时间:2022-01-08 06:34:50

一、前言

Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。

  1. 很多 shell 脚本处理不了或者处理不方便的事情 python 可以干
  2. python代码简单,配置简单,各种开源库多
  3. 效率高,性价比高

二、下载安装

官网:https://www.python.org

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

第三行:代表输出运行的操作系统环境

第五行:代表从标准输入读一行

执行结果:

CentOS初步学习记录(八)Python + Shell

三、相关工具

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()

执行结果:

CentOS初步学习记录(八)Python + Shell

五、Shell 分析

5.1 查看连接数

netstat 查看 80 端口的连接数(TIME_WAIT 状态):

netstat -apt | grep "TIME_WAIT" | grep ":http" | wc -l

执行结果:

CentOS初步学习记录(八)Python + Shell

5.2 分析 apache 日志

1)查看日志

apache 日志文件默认位置为:/etc/httpd/logs

cat /etc/httpd/logs/access_log

执行结果类似:

CentOS初步学习记录(八)Python + Shell

2)查看总记录数

wc -l /etc/httpd/logs/access_log

执行结果类似:

CentOS初步学习记录(八)Python + Shell

3)统计去重后倒排序的 ip 访问次数

cat access_log | awk '{print $1}' | sort | uniq -c | sort -nr

执行结果类似:

CentOS初步学习记录(八)Python + Shell

六、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()

执行结果类似:

CentOS初步学习记录(八)Python + Shell