zoukankan      html  css  js  c++  java
  • Python运维中常用的_脚本

    前言

      file是一个类,使用file('file_name', 'r+')这种方式打开文件,返回一个file对象,以写模式打开文件不存在则会被创建。但是更推荐使用内置函数open()来打开一个文件。


      首先open是内置函数,使用方式是open('file_name', mode, buffering),返回值也是一个file对象,同样,以写模式打开文件如果不存在也会被创建一个新的。

    f=open('/tmp/hello','w')

    #open(路径+文件名,读写模式)

    #读写模式:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件.常用模式

    如:'rb','wb','r+b'等等

    读写模式的类型有:

    rU 或 Ua 以读方式打开, 同时提供通用换行符支持 (PEP 278)

    w 以写方式打开,

    a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)

    r+ 以读写模式打开

    w+ 以读写模式打开 (参见 w )

    a+ 以读写模式打开 (参见 a )

    rb 以二进制读模式打开

    wb 以二进制写模式打开 (参见 w )

    ab 以二进制追加模式打开 (参见 a )

    rb+ 以二进制读写模式打开 (参见 r+ )

    wb+ 以二进制读写模式打开 (参见 w+ )

    ab+ 以二进制读写模式打开 (参见 a+ )

    注意:

    1、使用'W',文件若存在,首先要清空,然后(重新)创建,

    2、使用'a'模式 ,把所有要写入文件的数据都追加到文件的末尾,即使你使用了seek()指向文件的其他地方,如果文件不存在,将自动被创建。

    f.read([size]) size未指定则返回整个文件,如果文件大小>2倍内存则有问题.f.read()读到文件尾时返回""(空字串)

    file.readline() 返回一行

    file.readline([size]) 返回包含size行的列表,size 未指定则返回全部行

    for line in f:

    print line #通过迭代器访问

    f.write("hello ") #如果要写入字符串以外的数据,先将他转换为字符串.

    f.tell() 返回一个整数,表示当前文件指针的位置(就是到文件头的比特数).

    f.seek(偏移量,[起始位置])

    用来移动文件指针

    偏移量:单位:比特,可正可负

    起始位置:0-文件头,默认值;1-当前位置;2-文件尾

    f.close() 关闭文件

    要进行读文件操作,只需要把模式换成'r'就可以,也可以把模式为空不写参数,也是读的意思,因为程序默认是为'r'的。

    >>>f = open('a.txt', 'r')

    >>>f.read(5)

    'hello'

    read( )是读文件的方法,括号内填入要读取的字符数,这里填写的字符数是5,如果填写的是1那么输出的就应该是‘h’。

    打开文件文件读取还有一些常用到的技巧方法,像下边这两种:

    1、read( ):表示读取全部内容

    2、readline( ):表示逐行读取

    一、用Python写一个列举当前目录以及所有子目录下的文件,并打印出绝对路径

    #!/usr/bin/env python

    import os

    for root,dirs,files in os.walk('/tmp'):

    for name in files:

    print (os.path.join(root,name))

    os.walk()

    原型为:os.walk(top, topdown=True, onerror=None, followlinks=False)

     

    我们一般只使用第一个参数。(topdown指明遍历的顺序)

     

    该方法对于每个目录返回一个三元组,(dirpath, dirnames, filenames)。

    第一个是路径,第二个是路径下面的目录,第三个是路径下面的非目录(对于windows来说也就是文件)

    os.listdir(path)

    其参数含义如下。path 要获得内容目录的路径

    二、写程序打印三角形

    #!/usr/bin/env python

    input = int(raw_input('input number:'))

    for i in range(input):

    for j in range(i):

    print '*',

    print ' '

     

    三、猜数器,程序随机生成一个个位数字,然后等待用户输入,输入数字和生成数字相同则视为成功。

    成功则打印三角形。失败则重新输入(提示:随机数函数:random)

    #!/usr/bin/env python

    import random

    while True:

    input = int(raw_input('input number:'))

    random_num = random.randint(1, 10)

    print input,random_num

    if input == random_num:

    for i in range(input):

    for j in range(i):

    print '*',

    print ' '

    else:

    print 'please input number again'

     

    四、请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如今天生成的文件为2016-09-23.log, 并且把磁盘的使用情况写到到这个文件中。


    #!/usr/bin/env python

    #!coding=utf-8

    import time

    import os

    new_time = time.strftime('%Y-%m-%d')

    disk_status = os.popen('df -h').readlines()

    st1 = ''.join(disk_status)

    f = file(new_time+'.log','w')

    f.write('%s' % str1)

    f.flush()

    f.close()

     

    五、统计出每个IP的访问量有多少?(从日志文件中查找)


    #!/usr/bin/env python

    #!coding=utf-8

    list = []

    f = file('/tmp/1.log')

    str1 = f.readlines()

    f.close()

    for i in str1:

    ip = i.split()[0]

    list.append(ip)

    list_num = set(list)

    for j in list_num:

    num = list.count(j)

    print '%s : %s' %(j,num)

    1. 写个程序,接受用户输入数字,并进行校验,非数字给出错误提示,然后重新等待用户输入。

    1. 根据用户输入数字,输出从0到该数字之间所有的素数。(只能被1和自身整除的数为素数)

    #!/usr/bin/env python

    #coding=utf-8

    import tab

    import sys

    while True:

    try:

    n = int(raw_input('请输入数字:').strip())

    for i in range(2, n + 1):

    for x in range(2, i):

    if i % x == 0:

    break

    else:

    print i

    except ValueError:

    print('你输入的不是数字,请重新输入:')

    except KeyboardInterrupt:

    sys.exit(' ')

     

    六、python练习 抓取web页面

    from urllib import urlretrieve

    def firstNonBlank(lines):

    for eachLine in lines:

    if not eachLine.strip():

    continue

    else:

    return eachLine

    def firstLast(webpage):

    f=open(webpage)

    lines=f.readlines()

    f.close

    print firstNonBlank(lines), #调用函数

    lines.reverse()

    print firstNonBlank(lines),

    def download(url= 'http://www.usr.com/72446.html',process=firstLast):

    try:

    retval = urlretrieve(url) [0]

    except IOError:

    retval = None

    if retval:

    process(retval)

    if name == 'main':

    download()

     

    七、Python中的sys.argv[]用法练习


    #!/usr/bin/python

    # -- coding:utf-8 --

    import sys

    def readFile(filename):

    f = file(filename)

    while True:

    fileContext = f.readline()

    if len(fileContext) ==0:

    break;

    print fileContext

    f.close()

    if len(sys.argv) < 2:

    print "No function be setted."

    sys.exit()

    if sys.argv[1].startswith("-"):

    option = sys.argv1

    ** **

    if option == 'version':

    print "Version1.2"

    elif option == 'help':

    print "enter an filename to see the context of it!"

    else:

    print "Unknown function!"

    sys.exit()

    else:

    for filename in sys.argv[1:]:

    readFile(filename)

     

    八、python迭代查找目录下文件


    #两种方法

    #!/usr/bin/env python

    import os

     

    dir='/root/sh'

    '''

    def fr(dir):

    filelist=os.listdir(dir)

    for i in filelist:

    fullfile=os.path.join(dir,i)

    if not os.path.isdir(fullfile):

    if i == "1.txt":

    #print fullfile

    os.remove(fullfile)

    else:

    fr(fullfile)

     

    '''

    '''

    def fw()dir:

    for root,dirs,files in os.walk(dir):

    for f in files:

    if f == "1.txt":

    #os.remove(os.path.join(root,f))

    print os.path.join(root,f)

    '''

     

    九、ps 可以查看进程的内存占用大小,写一个脚本计算一下所有进程所占用内存大小的和。

    (提示,使用ps aux 列出所有进程,过滤出RSS那列,然后求和)

    #!/usr/bin/env python

    #!coding=utf-8

    import os

    list = []

    sum = 0

    str1 = os.popen('ps aux','r').readlines()

    for i in str1:

    str2 = i.split()

    new_rss = str2[5]

    list.append(new_rss)

    for i in list[1:-1]:

    num = int(i)

    sum = sum + num

    print '%s:%s' %(list[0],sum)

     

    写一个脚本,判断本机的80端口是否开启着,如果开启着什么都不做,如果发现端口不存在,那么重启一下httpd服务,并发邮件通知你自己。脚本写好后,可以每一分钟执行一次,也可以写一个死循环的脚本,30s检测一次。

    #!/usr/bin/env python

    #!coding=utf-8

    import os

    import time

    import sys

    import smtplib

    from email.mime.text import MIMEText

    from email.MIMEMultipart import MIMEMultipart

     

    def sendsimplemail (warning):

    msg = MIMEText(warning)

    msg['Subject'] = 'python first mail'

    msg['From'] = 'root@localhost'

    try:

    smtp = smtplib.SMTP()

    smtp.connect(r'smtp.126.com')

    smtp.login('要发送的邮箱名', '密码')

    smtp.sendmail('要发送的邮箱名', ['要发送的邮箱名'], msg.as_string())

    smtp.close()

    except Exception, e:

    print e

     

    while True:

    http_status = os.popen('netstat -tulnp | grep httpd','r').readlines()

    try:

    if http_status == []:

    os.system('service httpd start')

    new_http_status = os.popen('netstat -tulnp | grep httpd','r').readlines()

    str1 = ''.join(new_http_status)

    is_80 = str1.split()[3].split(':')[-1]

    if is_80 != '80':

    print 'httpd 启动失败'

    else:

    print 'httpd 启动成功'

    sendsimplemail(warning = "This is a warning!!!")#调用函数

    else:

    print 'httpd正常'

    time.sleep(5)

    except KeyboardInterrupt:

    sys.exit(' ')

     

    #!/usr/bin/python

    #-- coding:utf-8 --

    #输入这一条就可以在Python脚本里面使用汉语注释!此脚本可以直接复制使用;

     

    while True: #进入死循环

    input = raw_input('Please input your username:')

    #交互式输入用户信息,输入input信息;

    if input == "wenlong":

    #如果input等于wenlong则进入此循环(如果用户输入wenlong)

    password = raw_input('Please input your pass:')

    #交互式信息输入,输入password信息;

    p = '123'

    #设置变量P赋值为123

    while password != p:

    #如果输入的password 不等于p(123), 则进此入循环

    password = raw_input('Please input your pass again:')

    #交互式信息输入,输入password信息;

    if password == p:

    #如果password等于p(123),则进入此循环

    print 'welcome to select system!' #输出提示信息;

    while True:

    #进入循环;

    match = 0

    #设置变量match等于0;

    input = raw_input("Please input the name whom you want to search :")

    #交互式信息输入,输入input信息;

    while not input.strip():

    #判断input值是否为空,如果input输出为空,则进入循环;

    input = raw_input("Please input the name whom you want to search :")

    #交互式信息输入,输入input信息;

    name_file = file('search_name.txt')

    #设置变量name_file,file('search_name.txt')是调用名为search_name.txt的文档

    while True:

    #进入循环;

    line = name_file.readline() #以行的形式,读取search_name.txt文档信息;

    if len(line) == 0: #当len(name_file.readline() )为0时,表示读完了文件,len(name_file.readline() )为每一行的字符长度,空行的内容为 也是有两个字符。len为0时进入循环;

    break #执行到这里跳出循环;

    if input in line: #如果输入的input信息可以匹配到文件的某一行,进入循环;

    print 'Match item: %s' %line #输出匹配到的行信息;

    match = 1 #给变量match赋值为1

    if match == 0 : #如果match等于0,则进入 ;

    print 'No match item found!' #输出提示信息;

    else: print "Sorry ,user %s not found " %input #如果输入的用户不是wenlong,则输出信息没有这个用户;

     

    #!/usr/bin/python

    while True:

    input = raw_input('Please input your username:')

    if input == "wenlong":

    password = raw_input('Please input your pass:')

    p = '123'

    while password != p:

    password = raw_input('Please input your pass again:')

    if password == p:

    print 'welcome to select system!'

    while True:

    match = 0

    input = raw_input("Please input the name whom you want to search :")

    while not input.strip():

    print 'No match item found!'

    input = raw_input("Please input the name whom you want to search :")

    name_file = file('search_name.txt')

    while True:

    line = name_file.readline()

    if len(line) == 0:

    break

    if input in line:

    print 'Match item: ' , line

    match = 1

    if match == 0 :

    print 'No match item found!'

    else: print "Sorry ,user %s not found " %input

     

    十、Python监控CPU情况

    1、实现原理:通过SNMP协议获取系统信息,再进行相应的计算和格式化,最后输出结果

    2、特别注意:被监控的机器上需要支持snmp。yum install -y net-snmp*安装

    """

    #!/usr/bin/python

    import os

    def getAllitems(host, oid):

    sn1 = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid + '|grep Raw|grep Cpu|grep -v Kernel').read().split(' ')[:-1]

    return sn1

     

    def getDate(host):

    items = getAllitems(host, '.1.3.6.1.4.1.2021.11')

     

    date = []

    rate = []

    cpu_total = 0

    #us = us+ni, sy = sy + irq + sirq

    for item in items:

    float_item = float(item.split(' ')[3])

    cpu_total += float_item

    if item == items[0]:

    date.append(float(item.split(' ')[3]) + float(items[1].split(' ')[3]))

    elif item == item[2]:

    date.append(float(item.split(' ')[3] + items[5].split(' ')[3] + items[6].split(' ')[3]))

    else:

    date.append(float_item)

     

    #calculate cpu usage percentage

    for item in date:

    rate.append((item/cpu_total)*100)

     

    mean = ['%us','%ni','%sy','%id','%wa','%cpu_irq','%cpu_sIRQ']

     

    #calculate cpu usage percentage

    result = map(None,rate,mean)

    return result

     

    if name == 'main':

    hosts = ['192.168.10.1','192.168.10.2']

    for host in hosts:

    print '==========' + host + '=========='

    result = getDate(host)

    print 'Cpu(s)',

    #print result

    for i in range(5):

    print ' %.2f%s' % (resulti,resulti),

    print

    print

     

    十一、Python监控网卡流量

    1、实现原理:通过SNMP协议获取系统信息,再进行相应的计算和格式化,最后输出结果

    2、特别注意:被监控的机器上需要支持snmp。yum install -y net-snmp*安装

    """

    #!/usr/bin/python

    import re

    import os

    #get SNMP-MIB2 of the devices

    def getAllitems(host,oid):

    sn1 = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid).read().split(' ')[:-1]

    return sn1

     

    #get network device

    def getDevices(host):

    device_mib = getAllitems(host,'RFC1213-MIB::ifDescr')

    device_list = []

    for item in device_mib:

    if re.search('eth',item):

    device_list.append(item.split(':')[3].strip())

    return device_list

     

    #get network date

    def getDate(host,oid):

    date_mib = getAllitems(host,oid)[1:]

    date = []

    for item in date_mib:

    byte = float(item.split(':')[3].strip())

    date.append(str(round(byte/1024,2)) + ' KB')

    return date

     

    if name == 'main':

    hosts = ['192.168.10.1','192.168.10.2']

    for host in hosts:

    device_list = getDevices(host)

     

    inside = getDate(host,'IF-MIB::ifInOctets')

    outside = getDate(host,'IF-MIB::ifOutOctets')

     

    print '==========' + host + '=========='

    for i in range(len(inside)):

    print '%s : RX: %-15s TX: %s ' % (device_list[i], inside[i], outside[i])

    print

    坚持这种真诚,那么总归能遇到良人。
  • 相关阅读:
    LeetCode "Super Ugly Number" !
    LeetCode "Count of Smaller Number After Self"
    LeetCode "Binary Tree Vertical Order"
    LeetCode "Sparse Matrix Multiplication"
    LeetCode "Minimum Height Tree" !!
    HackerRank "The Indian Job"
    HackerRank "Poisonous Plants"
    HackerRank "Kundu and Tree" !!
    LeetCode "Best Time to Buy and Sell Stock with Cooldown" !
    HackerRank "AND xor OR"
  • 原文地址:https://www.cnblogs.com/jiaxiaozia/p/12199188.html
Copyright © 2011-2022 走看看