我是python中的初学者,我正在编写一个python脚本来验证每个挂载点的利用率是否高于阈值。我可以调用shell命令并将输出保存到变量中。但是我无法使用变量来分割字段,检查利用率是否高于阈值并报告错误
/dev/mapper/system-root 20G 18G 1.4G 93% /
udev 3.9G 248K 3.9G 1% /dev
tmpfs 3.9G 68K 3.9G 1% /dev/shm
/dev/sda1 251M 71M 167M 30% /boot
/dev/mapper/system-oracle 128G 43G 79G 36% /opt/app/oracle
/dev/mapper/system-tmp 5.5G 677M 4.5G 13% /tmp
/dev/mapper/system-log 3.0G 140M 2.7G 5% /var/log
/dev/mapper/system-varsog 20G 654M 19G 4% /var/sog
/dev/mapper/system-backup 50G 24G 24G 50% /var/sog/backups
我想将字段5和字段6存储在关联数组中,并使用阈值验证字段5,并报告它是否高于阈值。
我使用下面的脚本来存储shell命令输出,现在我需要通过拆分它的字段进行处理,但我无法将它存储在数组中,因为它是多维的,所以我是否应该使用For Loop来存储不同的阵列。
在shell,awk和perl中很容易做到但是python似乎很难。
>>> import sys, os, time, threading, subprocess,datetime
>>> diskinfo_raw = subprocess.Popen("df -h", shell=True,stdout=subprocess.PIPE)
>>> output = diskinfo_raw.communicate()[0]
>>> print output
请帮我一个想法或参考。我已经使用loadtxt
选项探索了选项,但我不想将值存储在文件中并再次读取它。
答案 0 :(得分:1)
将WSO2 API Manager
用于数据源:
df -h
答案 1 :(得分:1)
您可以执行类似
的操作mount_usage = {line.split()[5]: line.split()[4] for line in output.split('\n')}
将给出一个字典,其中key是挂载点,值是使用率。
{'/': '93%', '/dev/shm': '1%', '/dev': '1%', '/boot': '30%', '/tmp': '13%', '/var/sog/backups': '50%', '/opt/app/oracle': '36%', '/var/log': '5%', '/var/sog': '4%'}
答案 2 :(得分:0)
作为一个单行:
dict((fields[5], fields[4]) for fields in [line.split() for line in output.strip().split("\n")][1:])
扩大并解释:
usage = dict() # Dictionaries are Python's associative arrays
for line in output.strip().split("\n")[1:]: # Get the lines with actual data
fields = line.split() # Break the line into fields
usage[fields[5]] = fields[4] # Map mount point to usage
答案 3 :(得分:0)
你可以试试这个:
>>> import subprocess
>>> threshold = 10
>>> child = subprocess.Popen(['df', '-h'], stdout=subprocess.PIPE)
>>> output = child.communicate()[0].strip().split("\n")
>>> for x in output[1:]:
... if int(x.split()[-2][:-1]) >= threshold:
... print x
这将列出磁盘使用率为10%或超过10%的所有文件系统
答案 4 :(得分:-1)
新的“子流程”模型包含很多控制权来获取外部命令的输出,但需要付出代价:它变得官僚主义。
对于快速脚本,旧方法仍然有效:
>>> import os
>>> du = os.popen("df -h").readlines()
>>>
>>> from pprint import pprint
>>> pprint(du)
['Filesystem Size Used Avail Use% Mounted on\n',
'devtmpfs 7,7G 0 7,7G 0% /dev\n',
'tmpfs 7,8G 164M 7,6G 3% /dev/shm\n',
'tmpfs 7,8G 1,2M 7,8G 1% /run\n',
'tmpfs 7,8G 0 7,8G 0% /sys/fs/cgroup\n',
'/dev/sda6 24G 12G 12G 51% /\n',
'tmpfs 7,8G 16K 7,8G 1% /tmp\n',
'/dev/sda5 24G 19G 4,1G 83% /var\n',
'/dev/sda3 147G 28G 119G 20% /opt\n',
'/dev/sda2 391G 313G 79G 81% /home\n',
'tmpfs 1,6G 20K 1,6G 1% /run/user/1000\n']
新的子进程模块还包含一些快捷方式,可以在不经过所有参数subprocess的情况下获取程序的输出.Popen需要:
>>> pprint(subprocess.check_output("df -h".split()).split("\n"))
['Filesystem Size Used Avail Use% Mounted on',
'devtmpfs 7,7G 0 7,7G 0% /dev',
...
因此,正如您所看到的,除了check_output
之外,子进程还具有Popen
函数,默认情况下会读取外部进程的所有输出并将其作为单个字符串返回。
调用的问题在于子进程模型要求外部进程的不同参数是列表的元素(并且程序名称作为参数)。因此,它需要subprocess.check_output(["df", "-h"])
- 我在上面用“df -h”命令行中的“split”替换,我通常在我的代码中这样做。