我必须更改文本的格式。
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)
答案 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])