2016-06-30 54 views
1

如果現有值存在,我想保留現有的行,或者將行添加到文件中。我正在編寫nagios主機文件的腳本。Python:如果不在文件中添加新行,保留現有行?

主機文件:

define host{ 
      use    hoststatus 
      host_name  linuxhost1 
      alias   linuxhost1 
      hostgroups  linuxgroup 
      Sev    1 
} 
define host{ 
      use    hoststatus 
      host_name  linuxhost2 
      alias   linuxhost2 
      hostgroups  linuxgroup 
      Sev    2 
} 
define host{ 
      use    hoststatus 
      host_name  linuxhost3 
      alias   linuxhost3 
      hostgroups  linuxgroup 
} 

define host{ 
      use    hoststatus 
      host_name  linuxhost4 
      alias   linuxhost4 
      hostgroups  linuxgroup 
} 

我寫了這個腳本,將行,如果該行不存在(即西弗線沒有出現在最後的兩個主機,所以如果西弗目前跳過它)對於前兩個主機我不想添加任何東西。

代碼:

import re,sys 

with open(sys.argv[1],'r') as f1: 
    data = f1.readlines() 

txt='' 

with open(sys.argv[1],'r') as f3: 
    severity=True 
    default=4 
    vmowner=True 
    default_VM = "XXXXXXXXXXXXXX" 

    for line in f3: 
     if line.strip().startswith('Sev'): 
      severity=False 

     if line.strip().startswith('Vmowner'): 
      vmowner=False 

    if severity: 
     txt = txt + "\tSev\t\t" + str(default) + "\n" 

    if vmowner: 
     txt = txt + "\tVmowner\t\t" + str(default_VM) + "\n" 
    txt = txt + "\tSevOwner\tYYYYYYYYYYYY\n" 
    txt = txt + "}\n" 

with open(sys.argv[1],'r+') as f2: 
    for line in data: 
     if line.strip().startswith('}'): 
      line = line.replace('}',txt) 
#  f2.write(line) 
     print line, 

但問題是我沒有得到確切的輸出。

生成的輸出:

define host{ 
      use    hoststatus 
      host_name  linuxhost1 
      alias   linuxhost1 
      hostgroups  linuxgroup 
      Sev    1 
     Vmowner   XXXXXXXXXXXXXX 
     SevOwner  YYYYYYYYYYYY 
} 

define host{ 
      use    hoststatus 
      host_name  linuxhost2 
      alias   linuxhost2 
      hostgroups  linuxgroup 
      Sev    2 
     Vmowner   XXXXXXXXXXXXXX 
     SevOwner  YYYYYYYYYYYY 
} 

define host{ 
      use    hoststatus 
      host_name  linuxhost3 
      alias   linuxhost3 
      hostgroups  linuxgroup 
     Vmowner   XXXXXXXXXXXXXX 
     SevOwner  YYYYYYYYYYYY 
} 


define host{ 
      use    hoststatus 
      host_name  linuxhost4 
      alias   linuxhost4 
      hostgroups  linuxgroup 
     Vmowner   XXXXXXXXXXXXXX 
     SevOwner  YYYYYYYYYYYY 
} 

預期輸出:

define host{ 
      use    hoststatus 
      host_name  linuxhost1 
      alias   linuxhost1 
      hostgroups  linuxgroup 
      Sev    1 
     Vmowner   XXXXXXXXXXXXXX 
     SevOwner  YYYYYYYYYYYY 
} 

define host{ 
      use    hoststatus 
      host_name  linuxhost2 
      alias   linuxhost2 
      hostgroups  linuxgroup 
      Sev    2 
     Vmowner   XXXXXXXXXXXXXX 
     SevOwner  YYYYYYYYYYYY 
} 

define host{ 
      use    hoststatus 
      host_name  linuxhost3 
      alias   linuxhost3 
      hostgroups  linuxgroup 
      Sev    4 
      Vmowner   XXXXXXXXXXXXXX 
      SevOwner  YYYYYYYYYYYY 
} 


define host{ 
      use    hoststatus 
      host_name  linuxhost4 
      alias   linuxhost4 
      hostgroups  linuxgroup 
      Sev    4 
      Vmowner   XXXXXXXXXXXXXX 
      SevOwner  YYYYYYYYYYYY 
} 

在此先感謝。

回答

1

這裏是我會做:

  • 讀取整個文件
  • 把它分解成塊
  • 分裂每個塊成線
  • 添加任何需要的數據
  • 翻拍整個塊
  • 重拍整個文件

from collections import OrderedDict 

default_sev = 4 
default_VM = "XXXXXXXXXXXXXX" 
default_sevowner = "YYYYYYYYYYYY" 

def add_missing(data_block): 
    data_block = data_block.strip("}\n") 
    lines = OrderedDict([line.split() for line in data_block.splitlines()]) 
    if "Sev" not in lines: 
     lines["Sev"] = default_sev 
    if "Vmowner" not in lines: 
     lines["Vmowner"] = default_VM 
    if "SevOwner" not in lines: 
     lines["SevOwner"] = default_sevowner 
    data = "" 
    for key, value in lines.items(): 
     data += "   {: <16}{}\n".format(key, value) 
    return "define host{{\n{}\n}}".format(data) 

with open(sys.argv[1]) as f1: 
    data = f1.read() 

blocks = data.split('define host{') #split into blocks 
blocks = filter(None, blocks) #remove empty blocks 

with open(sys.argv[1], 'w') as f1: 
    for block in blocks: 
     f1.write(add_missing(block)) 
+0

當我跑你的代碼我得到這個錯誤打印add_missing(塊) 文件「file.py」,第19行,在add_missing data + =「{:<16} {} \ n」.format(key,value) ValueError:格式爲零的長度字段名稱 –

+1

您必須使用非常舊的python版本。將其更改爲'data + =「{0:<16} {1} \ n」.format(key,value)' – Novel

0

在每個主機之後,您沒有將嚴重性標誌重置爲true。這意味着第一個主機將該標誌設置爲false,然後再檢查該標誌的後面的if語句永遠不會被輸入。您需要添加邏輯以檢查新主機文件的開始,以重置邏輯,如嚴重性標誌。

+0

我已經發現了。任何想法如何做不同? –

+0

根據你正在進行多少分析,你可能需要一個更強大的方法。但一個簡單的答案是在for循環中添加另一行檢查:if line.strip()。startswith('define host'):severity = True – BradMcDanel

+0

我已經添加了一些邏輯,但是for循環重複了多次爲那個主機。 –

相關問題