尝试编写一个脚本,该脚本将在整个文件中搜索某些字符串。
用于2个以上的字符串。
1) 首先搜索是检查以下两行之一:
0/RP1/CPU0 RP(Active)
或
0/RP0/CPU0 RP(Active)
如果'0/RP1/CPU0 RP(Active)
',则打印此消息“ execute command location 0/rp1/cpu0
”
如果'0/RP0/CPU0 RP(Active)
',则打印此消息“ execute command location 0/rp0/cpu0
”
2) 第二个搜索是检查以下多行之一: a)
INFO_LINE------------------: TITLE_LINE(A-Z)
State : ENABLED
b)
INFO_LINE------------------: TITLE_LINE(A-Z)
State : DISABLE
“ TITLE_LINE(A-Z)
”可能会略有不同,但是INFO_LINE
将是静态的,并且在ENABLED
或DISABLE
中都是相同的。
如果b)为true,则打印“ restart process on location (FROM SEARCH1)
。
我尝试了if/else/elif
语句,并一直在使用re.search进行正则表达式的研究。
#!/usr/bin/python
activerp = open('sample-output.txt')
def check_active_rp():
for line in activerp:
if line.find('0/RP1/CPU0 RP(Active)'):
print("execute command location 0/rp1/cpu0")
else:
if line.find('0/RP0/CPU0 RP(Active)'):
print("execute command location 0/rp0/cpu0")
运行此脚本python只会使我返回cli提示符,而我无法进一步完成其他搜索。
CLI $ python test.py CLI $
答案 0 :(得分:0)
我想这就是你想要的:
def check_active_rp():
string = '0/RP1/CPU0 RP(Active)'
for line in activerp:
if string in line:
print('execute command location 0/rp1/cpu0')
答案 1 :(得分:0)
我创建了一个文件,其中包含您正在搜索的字符串并进行了一些测试,并且您的示例应该提供了一些输出,尽管有误。我以为您对python脚本没有足够的了解,但是如果我错了,请纠正我。
要执行您的函数,您需要调用它。编写def
只是定义它。您可以找到有关here的更多信息。
我看到您正在为此使用正则表达式,但是如果要搜索的字符串中没有任何变化,则可以使用 find 函数。
问题是line.find()
返回一个整数而不是一个布尔值。因此,除非您的行以'0/RP1/CPU0 RP(Active)'
开头(否则它将返回0索引),否则您将始终输入第一个if语句。如果我们检查documentation,我们会发现 find 函数在未找到字符串的情况下返回-1。因此,您可以使用以下命令更改if语句:line.find('0/RP1/CPU0 RP(Active)') != -1
。对于多行字符串也可以这样做。唯一的事情是您需要将整个文件转储为字符串。因此,请牢记这一点是可以解决问题的解决方案。
def check_active_rp(activerp):
whole_file = activerp.read()
if whole_file.find('0/RP1/CPU0 RP(Active)') != -1:
print("execute command location 0/rp1/cpu0")
elif whole_file.find('0/RP0/CPU0 RP(Active)') != -1:
print("execute command location 0/rp0/cpu0")
if whole_file.find('INFO_LINE------------------: TITLE_LINE(A-Z)\n State : ENABLED') != -1:
print('state is ENABLED')
elif whole_file.find('INFO_LINE------------------: TITLE_LINE(A-Z)\n State : DISABLE') != -1:
print('restart process on location (FROM SEARCH1)')
with open('sample-output.txt') as active_rp:
check_active_rp(active_rp)
在您的示例中,您也永远不会关闭文件,因此我使用了with语句,该语句在处理IO时被认为是一种很好的做法。
更新:
我刚刚发现您想更改信息行中写的内容,在这种情况下,使用正则表达式是适当的。以下解决方案将起作用:
import re
def check_active_rp(activerp):
iterator = iter(activerp)
for line in iterator:
if line.find('0/RP1/CPU0 RP(Active)') != -1:
print("execute command location 0/rp1/cpu0")
elif line.find('0/RP0/CPU0 RP(Active)') != -1:
print("execute command location 0/rp0/cpu0")
pattern = re.compile('INFO_LINE------------------: ([A-Z]+)')
x = pattern.search(line)
if x:
line = next(iterator)
if line.find('ENABLED') != -1:
print('the {} is ENABLED'.format(x.group(1)))
elif line.find('DISABLE') != -1:
print('the {} is DISABLED'.format(x.group(1)))
因此,我们在文件外创建了一个迭代器,并开始逐行浏览文件。对于第一个字符串搜索,我们仍然使用字符串查找功能。现在我们继续到信息线。使用regex包,我们编译了一个捕获TITLE_LINE的正则表达式。找到后,我们从迭代器获取下一行,并再次检查字符串是否包含ENABLED或DISABLE;并进行相应打印。