2015-11-05 4 views
0

Новое на сайте, надеюсь, мой вопрос не упущен для многих деталей или слишком расплывчатым. По существу, я бегу NetBackup сценарий, чтобы создать новый файл:Проблемы с чтением и форматированием в python

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

The output of this file looks like this

Я хочу, чтобы затем отформатировать это и ввести его в другой файл, используя out.write, который задает имя пула, например, «Auth Pool», «Web Pool» и т. Д. Используйте count, чтобы узнать, сколько лент находится в состоянии «AVAILABLE» «FULL» «FROZEN» для каждого пула.

#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') 

В настоящее время мое знание ограничивает меня просто подсчет ДОСТУПНЫЕ ленты для первого пула с помощью раскола. Я новичок в python, поэтому, пожалуйста, будьте осторожны: P Вся помощь очень ценится.

+1

Replace изображение, текст. Пожалуйста, взгляните на [edit-help] (http://stackoverflow.com/editing-help). – Cyrus

+1

Если у вас возникли трудности с преобразованием образцового изображения в исходный текст, используйте эту ссылку https://www.newocr.com/ – repzero

ответ

0

Вот быстрый и грязный, который должен примерно делать то, что вы хотите, при условии, что ваш файл журнала разделен на вкладку. Если вы новичок в 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') 
+0

. Этот взгляд на многое из того, что мне нужно, спасибо! Много исследовать и учиться :) –

0

ИСПОЛЬЗОВАНИЯ 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() 

Поскольку этот вопрос был тег под Баш (я использую есть AWK язык сценариев на вашей ОС Linux)

ИСПОЛЬЗОВАНИЕ 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) 
} 
} 

запустить скрипт в вашем Баш оболочки

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

ПРИМЕЧАНИЕ отпечатывается РЕЗУЛЬТАТЫ В SHELL

Вы можете просто перенаправить вывод в файл

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