python中的读取和格式化问题

python中的读取和格式化问题,python,linux,bash,Python,Linux,Bash,新的网站,希望我的问题没有遗漏很多细节或太模糊。实际上,我正在运行一个netbackup脚本来创建一个新文件: subprocess.call('/usr/openv/netbackup/bin/goodies/available_media > /var/log/nbu/available_media' + adate, shell=True) 然后,我想将其格式化,并使用out.write将其输入到另一个文件中,该文件指定池名,例如Auth pool、Web pool等。使用coun

新的网站,希望我的问题没有遗漏很多细节或太模糊。实际上,我正在运行一个netbackup脚本来创建一个新文件:

subprocess.call('/usr/openv/netbackup/bin/goodies/available_media > /var/log/nbu/available_media' + adate, shell=True)
然后,我想将其格式化,并使用out.write将其输入到另一个文件中,该文件指定池名,例如Auth pool、Web pool等。使用count可确定每个池中有多少磁带处于完全冻结状态

#Pool #Full #Avail #Frozen
AUTH  100   5      23
到目前为止,我所做的工作如下:

from datetime import datetime
import subprocess
import os
import sys

date = datetime.now()
adate = '%s%s%s' % (date.year, date.month, date.day)

subprocess.call('/usr/openv/netbackup/bin/goodies/available_media >    /var/log/nbu/available_media' + adate, shell=True)

log = open('/var/log/nbu/available_media' + adate, 'r')
    text = log.read()
    auth = text.split('Auth_Offsite', 1)[0]
    notapes = auth.count('AVAILABLE')
目前,根据我的知识,我只能使用split计算第一个池的可用磁带数。我是python新手,所以请温柔一点:P
非常感谢您提供的所有帮助。

假设您的日志文件是以选项卡分隔的,那么这里有一个快速而肮脏的方法可以大致满足您的需要。如果您是python新手,有些函数对您来说可能是新的,但它应该会让您了解您可能希望在google上搜索的内容

log = open('/var/log/nbu/available_media' + adate, 'r')

# Splits on newline chars, skips the titles and ----- lines
lines = log.readlines()[2:] 

# Break up each line by field
lines = [line.strip().split('\t') for line in lines]

# Going to form a dictionary mapping pool names to dictionaries of tape state counts
states_dict = {}
all_states = set()
for line in lines:
    if len(line) == 1:
        current_pool = line[0]
        states_dict[current_pool] = {}
    elif len(line) > 1:
        state = line[-1]
        states_dict[current_pool][state] = states_dict[current_pool].setdefault(state, 0) + 1
        all_states.add(state)

all_states = sorted(list(all_states))

# write output
with open('output_file_name.txt','wb') as outfile:
    outfile.write('Pool\t' + '\t'.join(all_states) + '\n')
    for pool in states_dict:
        outfile.write(pool)
        for state in all_states:
            outfile.write('\t' + states_dict[pool].setdefault(state, 0))
        outfile.write('\n')
使用PYTHON

因为这个问题是bash下的标签,所以我正在使用的linux操作系统上有awk脚本语言

使用AWK

创建文件名awkscript并放置以下代码

#!/bin/awk 
BEGIN{OFS="\t\t";print("pool","full","frozen","avail")}{
if($0~/Auth pool/){
    full=frozen=avail=0;
    while(!($0~/Web pool|Support pool/) && getline){
        if($9=="FULL"){full++;};if($9=="FROZEN"){frozen++};
        if($9=="AVAILABLE"){avail++}
    };
    print("Auth pool",full,frozen,avail)
}
if($0~/Web pool/){
    full=frozen=avail=0;
    while(!($0~/Auth pool|Support pool/) && getline){
        if($9=="FULL"){full++;};if($9=="FROZEN"){frozen++};
        if($9=="AVAILABLE"){avail++}
    };
    print("Web pool",full,frozen,avail)
}
if($0~/Support pool/){
    full=frozen=avail=0;
    while(!($0~/Auth pool|Web pool/) && getline){
        if($9=="FULL"){full++;};if($9=="FROZEN"){frozen++};
        if($9=="AVAILABLE"){avail++}
    };
    print("Support pool",full,frozen,avail)
}
}
在bashshell中运行脚本

awk -f <path to awkscript> '/usr/openv/netbackup/bin/goodies/available_media'

这是我需要的,谢谢!要研究和学习的内容很多:如果您在将示例图片转换为原始文本时遇到困难,请使用此链接
awk -f <path to awkscript> '/usr/openv/netbackup/bin/goodies/available_media'
awk -f 'path to awkscript' '/usr/openv/netbackup/bin/goodies/available_media' > new_file