更改命令输出的格式

时间:2014-04-02 11:44:18

标签: python

我必须更改文本的格式。

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              20G   15G  4.2G  78% /
/dev/sda6              68G   39G   26G  61% /u01
/dev/sda2              30G  5.8G   22G  21% /opt
/dev/sda1              99M   19M   76M  20% /boot
tmpfs                  48G  8.2G   39G  18% /dev/shm
/dev/mapper/vg3-KPGBKUP4
               10T  7.6T  2.5T  76% /KPGBKUP4

我想要输出如下:

20G   15G  4.2G  78% 
68G   39G   26G  61% 
30G  5.8G   22G  21% 
99M   19M   76M  20% 
48G  8.2G   39G  18% 
10T  7.6T  2.5T  76%

这就是我所做的,但这要求我在我的脚本中放入所有分区的名称。我必须在超过25个具有不同分区名称的服务器上运行此脚本,该服务器不断更改。还有更好的办法吗?

这是我目前的剧本:

import os, sys, fileinput
for line in fileinput.input('report.txt', inplace= True):
    line = line.replace("/dev/sda3              ", "")
    line = line.replace("/dev/sda6              ", "")
    line = line.replace("/dev/sda2              ", "")
    line = line.replace("/dev/sda1              ", "")
    line = line.replace("tmpfs                  ", "")
    line = line.replace("/dev/mapper/vg3-KPGBKUP4", "")
    line = line.replace("/KPGBKUP4", "")
    line = line.lstrip()
    sys.stdout.write(line) 

6 个答案:

答案 0 :(得分:1)

您可以使用正则表达式:

import os, sys, fileinput
import re

for line in fileinput.input('report.txt', inplace= True):
    sys.stdout.write(re.sub('^.+?\s+','', line.strip()))

如果文件中出现了类似于第一个示例的情况,当实际(不仅仅是在终端中)由换行符分成两行时,您应该将整个文件读取到变量,并使用{ flags=re.MULTILINE函数中的{1}}:

sub()

答案 1 :(得分:1)

你尝试过这样的事吗?

import os, sys, fileinput
for line in fileinput.input('report.txt'):
    line = line.split()
    print ' '.join(line[1:])

答案 2 :(得分:1)

这适用于您提供的输入:

for line in open('report.txt'):
    if line.startswith('Filesystem'):
        # Skip header line
        continue
    try:
        part, size, used, avail, used_percent, mount = line.split(None)
    except ValueError:
        # Unexpected line format, skip
        continue

    print ' '.join([size,
                    used.rjust(5),
                    avail.rjust(5),
                    used_percent.rjust(5)])

这里的一个关键点是使用line.split(None)来分割连续的空格 - 有关此行为的详细信息,请参阅split()`上的文档。

另请参阅str.rjust(),了解如何将字符串格式化为右对齐。

答案 3 :(得分:1)

#!/usr/bin/env python                                                                                            

import re, subprocess, shlex

cmd = 'df -Th'

# execute command
output = subprocess.Popen(shlex.split(cmd), stdout = subprocess.PIPE)
# read stdout-output from command
output = output.communicate()[0]
# concat line-continuations
output = re.sub(r'\n\s+', ' ', output)
# split output to list of lines
output = output.splitlines()[1:]

# print fields right-aligned in columns of width 6
for line in output:
    print("{2:>6}{3:>6}{4:>6}{5:>6}".format(*tuple(line.split())))

我使用subprocess来执行df-Command而不是阅读report.txt。

要格式化输出,我使用了pythons Format String Syntax

答案 4 :(得分:0)

这是一个快速而肮脏的解决方案:

first = True
for line in open('A.py'):
    # Skip the header row
    if first:
        first = False
        continue
    # For skipping improperly formatted lines, like the last one
    if len(line.split()) == 6:
        filesystem, size, used, avail, use, mount = line.split()
        print size, used, avail, use

答案 5 :(得分:-1)

print ' '.join(line.split()[1:5])