在python中从df-h输出中选择特定列

2024-04-23 13:33:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个简单的脚本,该脚本将从unixdf - h命令中选择特定的列。我可以使用awk来实现这一点,但是我们如何在python中实现这一点呢?

这里是df -h输出:

Filesystem                    Size  Used  Avail  Use%  Mounted on
/dev/mapper/vg_base-lv_root   28G   4.8G    22G   19%  /
tmpfs                        814M   176K   814M    1%  /dev/shm
/dev/sda1                    485M   120M   340M   27%  /boot

我想要这样的东西:

第1栏:

Filesystem
/dev/mapper/vg_base-lv_root           
tmpfs                 
/dev/sda1

第2栏:

Size
28G
814M 
485M   

Tags: dev命令脚本dfbasesizerootmapper
3条回答

不是问题的答案,但我试图解决这个问题。:)

from os import statvfs

with open("/proc/mounts", "r") as mounts:
    split_mounts = [s.split() for s in mounts.read().splitlines()]

    print "{0:24} {1:24} {2:16} {3:16} {4:15} {5:13}".format(
            "FS", "Mountpoint", "Blocks", "Blocks Free", "Size", "Free")
    for p in split_mounts:
        stat = statvfs(p[1])
        block_size = stat.f_bsize
        blocks_total = stat.f_blocks
        blocks_free = stat.f_bavail

        size_mb = float(blocks_total * block_size) / 1024 / 1024
        free_mb = float(blocks_free * block_size) / 1024 / 1024

        print "{0:24} {1:24} {2:16} {3:16} {4:10.2f}MiB {5:10.2f}MiB".format(
                p[0], p[1], blocks_total, blocks_free, size_mb, free_mb)

下面是完整的示例:

import subprocess
import re

p = subprocess.Popen("df -h", stdout=subprocess.PIPE, shell=True)
dfdata, _ = p.communicate()

dfdata = dfdata.replace("Mounted on", "Mounted_on")

columns = [list() for i in range(10)]
for line in dfdata.split("\n"):
    line = re.sub(" +", " ", line)
    for i,l in enumerate(line.split(" ")):
        columns[i].append(l)

print columns[0]

它假定装入点不包含空格。

下面是一个更完整(更复杂)的解决方案,它不需要硬核数列:

import subprocess
import re

def yield_lines(data):
    for line in data.split("\n"):
        yield line

def line_to_list(line):
    return re.sub(" +", " ", line).split()

p = subprocess.Popen("df -h", stdout=subprocess.PIPE, shell=True)
dfdata, _ = p.communicate()

dfdata = dfdata.replace("Mounted on", "Mounted_on")

lines = yield_lines(dfdata)

headers = line_to_list(lines.next())

columns = [list() for i in range(len(headers))]
for i,h in enumerate(headers):
    columns[i].append(h)

for line in lines:
    for i,l in enumerate(line_to_list(line)):
        columns[i].append(l)

print columns[0]

可以使用^{}运行命令并检索其输出,然后使用^{}^{}拆分行和字段。运行^{},而不是df -h,这样,如果列太长,就不会拆分行。

df_output_lines = [s.split() for s in os.popen("df -Ph").read().splitlines()]

结果是一个行列表。要提取第一列,可以使用[line[0] for line in df_output_lines](注意,列是从0开始编号的)等。您可能需要使用df_output_lines[1:]而不是df_output_lines来删除标题行。

如果已经将df -h的输出存储在某个文件中,则需要首先连接这些行。

fixed_df_output = re.sub('\n\s+', ' ', raw_df_output.read())
df_output_lines = [s.split() for s in fixed_df_output.splitlines()]

注意,这假定文件系统名和装入点都不包含空格。如果是这样的话(这在某些unix变体上的一些设置中是可能的),几乎不可能解析df,甚至df -P的输出。您可以使用^{}来获取给定文件系统的信息(这是C function的Python接口,该接口在内部为每个文件系统调用,df),但是没有枚举文件系统的可移植方法。

相关问题 更多 >