egrep和条件不工作的日志文件使用以下命令:
我的命令是:
egrep -E "20-Sep-20|^[ ]*|^[ ]*21-Sep-20.*6f0747e47829.*oMXskCaN0RWrdfT" file.log结果:
21-9月20日14:30:40.223调试6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT prep -*结束*
9月21日-20日14:30:40.223 INFO 6f0747e47829 QzAJ7ru4ayOWqRm
oMXskCaN0RWrdfT prep -数据准备步骤
*21-9月20日14:30:40.273 INFO 6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT prep -依赖步骤已被删除,step_id = 9l2CDtSl2ZmTOUk 21-9月20日14:30:40.439 INFO
6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT准备步骤运行完成: success=True 22-9月20日14:30:40.500 INFO 6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT准备-依赖步骤已用step_id = 9l2CDtSl2ZmTOUk 22-9月20日14:30:40.560 INFO删除。
6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT准备-步骤运行完成: success=True 22-9月20日14:30:40.600错误6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT-回溯(最近一次调用):
文件"/usr/local/lib/python3.7/site-packages/wiz_task/tasks/modeling/py_module.py",第55行,在run_py_module (成功,报告)= instance.execute(project_id,process_id,module_name,step_name,run_params,**kwargs)文件"/code/test_module/domkar/py_code/python-attributor/attributor/module.py",第62行中在execute "/code/test_module/domkar/py_code/python-attributor/attributor/model/model2.py",() model2_out.main()文件第883行中,在main model_constr、FixedCoeffTable、规划师、Output_data=self.model () File "/code/test_module/domkar/py_code/python-attributor/attributor/model/model2.py",行503中,在model_constr_res = model_constr_worker.runSingleModel (cmodel_trfm_data_ref,model_constr,文件"/code/test_module/domkar/py_code/python-attributor/attributor/lib/algo/model_worker.py",第1283行,在runSingleModel model_result = self.runMixedModel (数据,模型,light_mode)文件的第625行中,在runMixedModel返回self.runLinearModel (数据,模型,文件"/code/test_module/domkar/py_code/python-attributor/attributor/lib/algo/model_worker.py",第597行,在runLinearModel result.setRetention (DataUtility.retention (data,dep_var,date_var,fixed_vars,model.getHierarchyVars ())中)文件"/code/test_module/domkar/py_code/python-attributor/attributor/lib/data/data_utility.py",行396,在保留: NameError:名称‘aaaaaaaaaaaaaaaaaaaa未定义23-9月20日14:30:40.439 INFO 6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT prep -步骤运行完成: success=True
预期结果:
当给定无效的字符串(模式)和条件时,失败并仍然返回结果,但是我需要空结果。因为给定的模式与文件不匹配。
发布于 2020-09-25 08:24:58
根据您的评论,您正在尝试匹配两种模式之间的所有行。这在grep中是不可能的,因为grep可以逐行工作.您可以匹配一行,但在下一行之前,grep无法知道它是否应该匹配,这完全取决于它以前是否匹配。
你所做的不是“和条件”,我不明白你的意思。Perl正则表达式有一种" and“子句(称为展望),但它的意思是”此时,下一个字符应该同时匹配这个模式和另一个模式“(看起来比这个更微妙,但我正在简化)。你不可能用它来做你想要的。
为了学习,让我们分析一下您的模式:
20-Sep-20|^[ ]*|^[ ]*21-Sep-20.*6f0747e47829.*oMXskCaN0RWrdfT|字符的意思是“或”。因此,您将匹配与以下三种模式之一匹配的任何一行:
20-Sep-20
^[ ]*
^[ ]*21-Sep-20.*6f0747e47829.*oMXskCaN0RWrdfT第二个模式的意思是“任何非空格字符,任何次数(包括零)在行的开头”。什么都配得上。因此grep将匹配您输入的每一行,并按原样输出。
您真正想要的是“匹配这一行,后面跟着任意数量的字符(包括换行符),后面跟着这一行”。没有“和”,这是一个单一的模式。但是它需要同时应用于多行,而grep不能这样做。
然而,有一些方法可以使用其他程序来实现这一点。下面是一个关于awk的例子:
awk '/20-Sep-20/ { a=1 } ; { if (a == 1) print } ; /^[ ]*21-Sep-20.*6f0747e47829.*oMXskCaN0RWrdfT/ { exit }' file.log我在这里要做的是,一句一句地说:
在匹配“20-9-20”的
由于添加了如果第二种模式不匹配的命令不应该返回任何内容的要求,我看到的最明显的解决方案是为它提供第一个grep,并且只在匹配时执行awk。
end_pattern='^[ ]*21-Sep-20.*6f0747e47829.*oMXskCaN0RWrdfT'
grep -qE "$end_pattern" file.log && awk "/20-Sep-20/ { a=1 } ; { if (a == 1) print } ; /$end_pattern/ { exit }" file.log但是,如果在第一个模式之前找到第二个模式,这就行不通了。
实现这一点的另一种完全不同的方法是grep --带有grep选项"-n“的起始行和结束行,以获得行号,然后使用头和尾(或sed)来获得范围(如果这两种模式匹配,并且结束>启动)。
第三种方法是使用支持多行正则表达式的编程语言。
发布于 2020-09-25 10:16:38
让我给您一个一般性的回答:如何在grep中创建逻辑表达式
grep -E "cond1|cond2"
grep "cond1" | grep "cond2"处理
因此,如果您想要grep,比方说在cond1 AND (cond2 OR cond3)上,您需要这样的东西:
grep "cond1" | grep -E "cond2|cond3"所以,请编辑你的问题,并清楚地解释条件和它们的逻辑关系。
此外,正如在答案和注释中所解释的:^[ ]*意味着您的行可能以空格开始(基本上每行都是这样),所以不要再使用它了。
评论后的编辑
作为您的示例:假设您希望看到9月20日或9月21日的条目,所有这些条目都必须包含字符串"oMXskCaN0RWrdfT",您可以执行以下操作:
grep -E "20-Sep-20|21-Sep-20" file.log | grep "oMXskCaN0RWrdfT"https://stackoverflow.com/questions/64045088
复制相似问题