分类目录归档:计算机与 Internet

公众号更新

公众号很久没有更新了,因为微信不支持个人公众号进行认证,很多功能用不了,所以后来也就没有继续更新什么内容。

不过最近才发现还有不少人在用这个公众号的功能,于是又捡起来,趁着假期加班的间隙,更新了一下。对于搜索返回多个结果的改为新页面里显示,就不受微信返回消息数量的限制了。另外就是补充了部分Power8和Power9设备的位置号信息和备件信息。

从劳动节出差到青年节,已经记不清是第几个数据中心迁移的项目了。有时候多做一点,并不是吃亏,做什么都是有回报的,算得太清楚,并不一定就占了便宜。

当然,还是看到了年轻人的努力和积极,无论外部环境如何,公司如何,先想想自己是否对得起这份工资。多赚钱并不是成功,能很骄傲的说自己的付出是比收入多的,那才是一种心安理得。

最后,翻滚吧,后浪,永远不要失去希望和好奇。

移动发布博客

博客很多年没有更新了,主要是用微信朋友圈和微博多,但有时候一些长的东西觉得还是用博客比较方便,也便于以后整理和查看。
配置了一下,用手机也能写博客了,这条就当作是测试一下。

Step By Step使用Python分析AIX SNAP(5)——批量处理多个文件

之前我们使用Python抓取信息,都是处理一个SNAP文件,而实际情况中,我们手上经常有多个SNAP文件需要处理,比如巡检或者信息统计。而同时处理多个文件,才能更大的发挥Python的威力。

我们在上次example4的基础上,加入一个循环,读取当前目录下的所有SNAP文件。

为了方便使用和扩展,我们把example4中的功能,定义为一个名为readsnap的函数。

另外,输出的格式,由于是需要输出多个文件的信息,因此我们把格式改为Excel表格一行输出一个文件的信息,每行的第一格输出Node Name,第二格输出CPU,第三格输出内存。

示例程序如下:

#! /usr/bin/env python
#coding=utf-8

import tarfile
import xlwt

import os
import sys
import os.path
#导入以上模块用于获取当前路径及当前目录下的文件名

def readsnap(table,file,linenum):
snapfile = tarfile.open(file)
#打开snap.pax文件
lparinfo=snapfile.extractfile("./general/lparstat.out").readlines()
#读取snap.pax包中的/general/lparstat.out文件

for line in lparinfo:
#循环读取lparstat.out的内容,每个循环中的line表示一行
outputline=line.split(":")
#以":"为关键字去分隔line的内容

if line.find("Node Name")!=-1:
table.write(linenum,0,outputline[1].strip())
#将node name写入每行第一格
if line.find("Online Virtual CPUs")!=-1:
table.write(linenum,1,outputline[1].strip())
#将CPU数写入每行第二格
if line.find("Online Memory")!=-1:
table.write(linenum,2,outputline[1].strip())
#将memory数写入每行第二格

linenum=linenum+1
#行号加1
return linenum
#返回行号

#以上为定义函数readsnap()部分

excelfile = xlwt.Workbook()
table = excelfile.add_sheet(u"测试表")
#创建一个Excel表对象,并创建一个名为“测试表”的sheet

linenum=0
#定义表格行号从0开始

for dirpath, dirnames, filenames in os.walk('.'):
#循环读取当前路径文件名
for filename in filenames:
if os.path.splitext(filename)[1] == '.pax':
#如果文件扩展名为.pax
filepath = os.path.join(dirpath, filename)
print("file:" + filepath)
linenum=readsnap(table,filepath,linenum)
#调用readsnap函数

excelfile.save("test.xls")
#将内容保存在“test.xls"文件

输出结果类似如下:

 

SAS_C 5 47872 MB
ETLSER_B 3 16384 MB

 

Step By Step使用Python分析AIX SNAP(4)——获取需要的信息

上一节我们已经知道了如何利用Python打开SNAP文件,以及如何把信息写入到Excel文件中。

但是SNAP中的信息很多,很多时候我们只是需要其中的一些信息,而不是把整个文件的内容都输出出来。

比如,我只是想知道这个OS的主机名和CPU内存资源,或者机器的型号序列号。

比如

SNAP里面/general/lparstat.out文件,包含如下信息

Node Name                                  : Node1
Partition Name                             : Node1
Partition Number                           : 6
Type                                       : Dedicated-SMT
Mode                                       : Capped
Entitled Capacity                          : 5.00
Partition Group-ID                         : 32774
Shared Pool ID                             : -
Online Virtual CPUs                        : 5
Maximum Virtual CPUs                       : 10
Minimum Virtual CPUs                       : 1
Online Memory                              : 47872 MB
Maximum Memory                             : 73728 MB
Minimum Memory                             : 2048 MB
Variable Capacity Weight                   : -
Minimum Capacity                           : 1.00
Maximum Capacity                           : 10.00
Capacity Increment                         : 1.00
Maximum Physical CPUs in system            : 16
Active Physical CPUs in system             : 16
Active CPUs in Pool                        : -
Shared Physical CPUs in system             : 0
Maximum Capacity of Pool                   : 0
Entitled Capacity of Pool                  : 0
Unallocated Capacity                       : -
Physical CPU Percentage                    : 100.00%
Unallocated Weight                         : -
Memory Mode                                : Dedicated
Total I/O Memory Entitlement               : -
Variable Memory Capacity Weight            : -
Memory Pool ID                             : -
Physical Memory in the Pool                : -
Hypervisor Page Size                       : -
Unallocated Variable Memory Capacity Weight: -
Unallocated I/O Memory entitlement         : -
Memory Group ID of LPAR                    : -
Desired Virtual CPUs                       : 5
Desired Memory                             : 47872 MB
Desired Variable Capacity Weight           : -
Desired Capacity                           : 5.00
Target Memory Expansion Factor             : -
Target Memory Expansion Size               : -
Power Saving Mode                          : Disabled

假如我们只需要输出Node Name 、Online Virtual CPUs 、Online Memory这三项内容,那么可以使用如下Python程序,修改自exmaple1

#! /usr/bin/env python
#coding=utf-8

import tarfile
snapfile = tarfile.open("snap.pax")
#打开snap.pax文件

lparinfo=snapfile.extractfile("./general/lparstat.out").readlines()
#读取snap.pax包中的/general/lparstat.out文件
#注意使用的是readlines(),表示按行读取,读取的结果是数组,即lparinfo[0]是第一行,lparinfo[1]是第二行。。。

outputfile=open("lparinfo.txt",'w')
#将输出保存在lparinfo.txt文件

for line in lparinfo:
    if line.find("Node Name")!=-1 or line.find("Online Virtual CPUs")!=-1 or line.find("Online Memory")!=-1:
        outputfile.write(line)
#这里是一个循环,循环取数组lparinfo中的每一个值给变量line,即第一次循环line=lparinfo[0],第二次循环line=lparinfo[1]
#line.find()表示在变量line字符串内查找是否有对应的内容,比如line.find("Node Name")就是查找line内是否存在"Node Name"
#返回的值是查找内容在line内的位置号,找不到就返回-1,line.find("Node Name")!=-1即表示line中有"Node Name"
#当查找到"Node Name"、"Online Virtual CPUs"、"Online Memory"任意一个时,输出该行内容到outputfile

outputfile.close()

将以上内容保存为example3.py,同目录下有一个snap.pax的文件,双击运行example3.py,就会产生一个lparinfo.txt的文件

内容应该是

Node Name                                  : Node1
Online Virtual CPUs                        : 5
Online Memory                              : 47872 MB

下一步,我们结合起来,不再把内容输出到文本文件,而是输出到Excel文件

#! /usr/bin/env python
#coding=utf-8

import tarfile
import xlwt

excelfile = xlwt.Workbook()
table = excelfile.add_sheet(u"测试表")
#创建一个Excel表对象,并创建一个名为“测试表”的sheet

snapfile = tarfile.open("snap.pax")
#打开snap.pax文件

lparinfo=snapfile.extractfile("./general/lparstat.out").readlines()
#读取snap.pax包中的/general/lparstat.out文件

i=0
#利用变量i来作为输出表格的行数

for line in lparinfo:
if line.find("Node Name")!=-1 or line.find("Online Virtual CPUs")!=-1 or line.find("Online Memory")!=-1:
outputline=line.split(":")
#以":"为关键字去分隔line的内容,分隔后的内容为数组outputline,outputline[0]表示分隔的第一部分,以此类推
table.write(i,0,outputline[0].strip())
table.write(i,1,outputline[1].strip())
#将line内容的第一部分outputline[0]写入第i行的第0格,第二部分outputline[1]写入第1格,strip()用于去除多余空格
i=i+1
#行号加1

excelfile.save("test.xls")
#将内容保存在“test.xls"文件

输出的Excel文件test.xls,内容应该是

Node Name Node1
Online Virtual CPUs 5
Online Memory 47872 MB

下次我们研究一下更复杂的数据抓取

Step By Step使用Python分析AIX SNAP(3)——打开SNAP与写入Excel

当初为什么选择Python来做这件事,主要是因为Python有以下几个好处:

1.语法比较简单,容易快速上手

2.功能足够强大,有各种现成的模块,能快速实现各种功能

之前我们说过,要用Python实现数据的抓取和输出功能,抓取需要能读取SNAP文件,输出需要能把信息写到Excel表格中。为了实现这两部分功能,我们不需要写一堆代码,因为已经有现成的模块,我们只需要下载回来简单安装一下就好。

(1)读取SNAP

上一次我们提到过,SNAP文件其实是打包了两层,首先是以pax格式将所有文件打包成一个文件,然后再以Z模式压缩了一遍。所以我们直接查看的时候,需要解包两次才能看到那些文件。

对于Z模式的压缩,似乎由于专利限制之类的问题,我目前没有找到现成的Python模块可以去解压缩,如果有哪位知道,欢迎告诉我。

而对于pax的打包,则是跟tar格式类似,可以使用Python自带的tarfile模块去打开。

所以我们可以先利用解压缩软件,解开压缩,让snap.pax.Z解压为snap.pax,然后就可以利用Python处理了。

先给出一个例子example1

#! /usr/bin/env python
#coding=utf-8
#以上两句用于声明python的环境和使用utf-8编码

import tarfile #导入tarfile模块,用于打开pax包文件
snapfile = tarfile.open("snap.pax")

#打开pax文件,其中snapfile为包文件对象,“snap.pax”是pax包文件的文件名
adapter=snapfile.extractfile("./general/lsdev.adapter").read()

#解包并读取包内的“./general/lsdev.adapter”文件,内容保存在名为adapter的对象
outputfile=open("lsdev-adapter.txt",'w')

#选择输出文件,“lsdev-adapter.txt”是输出的文件名,‘w’表示写模式,文件对象名为outputfile
outputfile.write(adapter)

#将adapter对应的内容写入outputfile
outputfile.close()

#使用完,关闭outputfile

如果你已经安装了Python,那么把上面的内容复制到记事本,然后保存为“example1.py”(文件名无所谓,以py结尾即可),同目录下有一个snap.pax的文件。双击运行一下“example1.py”,你就会看到同目录下增加了一个lsdev-adapter.txt的文件,打开里面的内容,就是SNAP包中lsdev.adapter的内容。

以上去掉注释(#号开头的部分),真正的语句只有6句。是不是非常简单?

这可以当做一个小模板,比如你想输出snap.pax里的/general/lsdev.disk的内容,那么把前面程序里

adapter=snapfile.extractfile("./general/lsdev.adapter").read()

引号内的.general/lsdev.adapter 替换为./general/lsdev.disk即可,非常简单。

 

(2)输出到Excel文件

Python自带的模块没有读写Excel的功能,这就需要额外安装。

能实现该功能的模块有很多,我使用的是python-excel

它其实是由3个模块组成,xlrd,xlwt,xlutils

xlrd  用于读取Excel文件

xlwt 用于把数据写入Excel文件

xlutils 实现一些处理Excel文件的功能

官网 http://www.python-excel.org/ 不过因为挂在Google的服务上,所以结果你懂的……

好在不影响我们下载使用,以下地方都可以下载到

https://github.com/python-excel     (包括3个模块和使用说明)

https://pypi.python.org/pypi/xlrd   xlrd模块

https://pypi.python.org/pypi/xlwt  xlwt模块

https://pypi.python.org/pypi/xlutils/  xlutils模块

顺便说一句 https://pypi.python.org/pypi  这个网站相当于Python模块的大集合,绝大多数Python的模块都会在这里,Python是非常鼓励大家共享代码共享功能的,不必重复去造轮子。

由于我们这次是要把信息输出到Excel文件,因此需要用到xlwt模块。

安装这个模块有两种方式,一种方式是在上面的网站下载xlwt,会得到一个压缩包,解压缩之后,在解包的目录下面,会看到一个setup.py的文件,然后在该目录下执行命令(需要切换到命令提示符操作)

python setup.py install

等待安装完成即可,基本上其他的Python模块也都可以使用这样的安装方法

第二种方式更简单,直接在Python的安装目录下,执行命令(需要切换到命令提示符操作)

pip install xlwt

就可以了。不过这种方式容易出错,建议大家用第一种方式保险一些。

安装完成后,就可以使用这个模块向Excel文件写内容了。

以下是一个例子

#! /usr/bin/env python
#coding=utf-8

import xlwt     #导入xlwt模块

excelfile = xlwt.Workbook()
#创建一个工作薄,可以理解为一个Excel文件,取名为excelfile

table = excelfile.add_sheet(u"测试表")
#创建一个表,对应就是Excel文件中的一个Sheet,名为table

table.write(0,0,u"测试")
#向table表中第0行第0列的单元格中写入“测试”两个字,因为使用了中文,所以引号前面加u,表示unicode编码的字符串

table.write(0,1,u"成功")
#向table表中第0行第1列的单元格中写入“成功”两个字

excelfile.save("test.xls")
#将内容保存为文件名是test.xls的Excel文件

将以上内容保存为example2.py,双击运行后,就会在同目录下生成一个test.xls的Excel文件,打开后内容就是“测试”,“成功”。

可以看到,同样是只用了6条语句,就实现了最简单的把内容写入Excel文件。

下一次我们就讲讲如何把这两者结合,实现我们的SNAP分析功能