簡體   English   中英

讀取和格式化python中的問題

[英]Reading and formatting issues in python

對該網站來說是新手,希望我的問題不會遺漏太多細節或太含糊。 本質上,我正在運行一個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來查找多少個磁帶處於“ AVAILABLE”狀態每個池“滿”“凍結”。

#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的新手,那么其中的某些功能可能對您來說是新手,但是它應該為您提供一些有關您至少要谷歌搜索的知識。

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

#!/bin/python
from __future__ import print_function
import re
header_type=None
my_file=open("/usr/openv/netbackup/bin/goodies/available_media","r")
results={"Auth pool":[],"Web pool":[],"Support pool":[]}
for line in my_file:
    if re.search("^ *Auth pool *$",line):
        header_type=re.search("^ *Auth pool *$",line).group()
    if re.search("^ *Web pool *$",line):
        header_type=re.search("^ *Web pool *$",line).group()
    if re.search("^ *Support pool *$",line):
        header_type=re.search("^ *Support pool *$",line).group()
    if header_type in results:
        tmp=line.split()
        if len(tmp)>=8 and tmp[8] in ["FULL","FROZEN","AVAILABLE"]:
            results[header_type].append(tmp[8])
new_file=open("/var/log/nbu/available_media","w")
new_file.write("#pool\t\t#full\t#Avail#Frozen\n")
for i in results:
    new_file.write(i+"\t")
    for j in ["FULL","FROZEN","AVAILABLE"]:
        counts=len([state_type for state_type in results[i] if state_type==j])
        new_file.write(str(counts)+"\t")
    new_file.write("\n")
new_file.close()

由於此問題是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)
}
}

在您的bash shell中運行腳本

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM