Python:如果不在文件中添加新行,是否保留现有行?

Python:如果不在文件中添加新行,是否保留现有行?,python,nagios,Python,Nagios,如果存在现有值,我希望保留现有行,或者将该行添加到文件中。我正在为nagios主机文件编写脚本 主机文件: define host{ use hoststatus host_name linuxhost1 alias linuxhost1 hostgroups linuxgroup Sev 1 } defin

如果存在现有值,我希望保留现有行,或者将该行添加到文件中。我正在为nagios主机文件编写脚本

主机文件:

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
}
我已经编写了这个脚本,如果该行不存在(即Sev行在最后两个主机中不存在,因此如果Sev存在,则跳过它),则为前两个主机添加该行,我不想添加任何内容

代码:

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
}
但问题是我没有得到确切的结果

生成的输出:

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
}
预期输出:

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
}

提前感谢。

在每个主机运行后,您不会将严重性标志重置为true。这意味着第一台主机将标志设置为false,然后再输入后面的if语句检查标志。您需要添加逻辑来检查新主机文件的开头,以重置逻辑,如严重性标志。

下面是我要做的:

  • 读取整个文件
  • 把它分成几块
  • 将每个块拆分为行
  • 添加任何需要的数据
  • 重做整个街区
  • 重新制作整个文件

从集合导入订单数据
默认值_sev=4
默认值\u VM=“xxxxxxxxxxxx”
默认值\u sevowner=“yyyyyyyyyy”
def add_缺失(数据块):
数据块=数据块.strip(“}\n”)
lines=OrderedDict([line.split()表示数据块中的行。splitlines()]))
如果“Sev”不在行中:
行[“Sev”]=默认值
如果“Vmowner”不在行中:
行[“Vmowner”]=默认值
如果“SevOwner”不在行中:
行[“SevOwner”]=默认值
data=“”
对于键,行中的值。项()

data+=“{:我已经发现了。你知道如何做吗?根据你正在做的分析的多少,你可能需要一个更健壮的方法。但一个简单的答案是在for循环中添加另一行检查:if line.strip().startswith('define host')):severity=TrueI我已经添加了some逻辑,但是Sev的for循环在该主机上重复了多次。在您发布的代码中,我看不到您如何检查主机定义的结尾。您需要添加逻辑来检查主机定义的结尾(我想在这种情况下只需检查“}”),然后添加类似于Sev的内容(如果设置了标志),然后重置所有标志。当我运行代码时,我遇到了以下错误:在add_missing data+=“{:您必须使用非常旧的python版本。将其更改为
data+=”{0: