egrp AND条件不适用于以下命令的日志文件:
我的命令是:
egrep -E "20-Sep-20|^[ ]*|^[ ]*21-Sep-20.*6f0747e47829.*oMXskCaN0RWrdfT" file.log
结果:
20年9月21日14:30:40.223调试6f0747e47829 QzAJ7ru4ayOWqRmoMXskCaN0RWrdfT准备-**************结束***************
20年9月21日14:30:40.223信息6f0747e47829 QzAJ7ru4ayOWqRm
oMXskcaN0RWrdf T准备-数据准备步骤
结束/strong>***20年9日14:30:40.273信息6f07 e47829QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT准备-依赖步骤已完成已删除,step_id=9l2CDtSl2ZmTOUk 20年9月21日14:30:40.439信息
6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT准备-步骤运行已完成:success=True 9月22日至20日14:30:40-500信息6f0747e47829QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT准备-依赖步骤已完成已删除,step_id=9l2CDtSl2ZmTOUk 20年9月22日14:30:40.560信息
6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT准备-步骤运行已完成:success=True 20年9月22日14:30:40.600错误6f0747e47829QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT-追溯(最近一次调用最后一次):
文件"/usr/local/lib/python3.7/site packages/wiz_task/tasks/modeling/py_module.py";,第55行,在run_py_module中(success,reports)=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行,执行中model2_out.main()文件"code/test_module/domkar/py_code/python attributor/attributor/model/model2.py";,883行,主要model_constr,FixedCoeffTable,planner,Output_data=self.model()文件"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,False)文件"code/test_module/domkar/py_code/python attributor/attributor/lib/algo/model_worker.py";,第1283行,在runSingleModel中model_result=self-runMixedModel(data,model,light_mode)File"/code/test_module/domkar/py_code/python attributor/attributor/lib/algo/model_worker.py";,第625行,在runMixedModel中return self-runLinearModel(data,model,light_mode)File"code/test_module/domkar/py_code/python attributor/attributor/lib/algo/model_worker.py";,第597行,在runLinearModel中result.setRetention(DataUtility.retension(data,dep_var,date_var,fixed_vars,model.getHierarchyVars())文件"code/test_module/domkar/py_code/python attributor/attributor/lib/data/data_utility.py";,396线,保留aaaaaaaaaa名称错误:未定义名称"aaaaaaAAAAAAAAAA"20年9月23日14:30:40.439信息6f0747e47829 QzAJ7ru4ayOWqRmoMXskCaN0RWrdfT准备-步骤运行完成:成功=真
预期结果:
当给定一个无效字符串(模式)时,AND条件失败,仍然返回结果,但我需要空结果。因为给定的模式与文件不匹配。
根据您的注释,您正在尝试匹配两个模式之间的所有行。这在grep中是不可能的,因为grep是逐行工作的。你可以匹配一行,但到下一行时,grep不能仅仅根据它之前是否匹配来判断它是否应该匹配。
你所做的并不是";"AND条件";,我不明白你的意思。Perl正则表达式具有一种";"与";子句(称为前瞻),但它的意思是";在这一点上,下一个字符应该与这个模式和这个另一个模式都匹配;(看起来比这更微妙,但我在简化)。没有办法用它来满足你的需求。
为了学习,让我们分析一下你的模式:
20-Sep-20|^[ ]*|^[ ]*21-Sep-20.*6f0747e47829.*oMXskCaN0RWrdfT
CCD_ 1字符表示">或";。因此,您正在匹配任何与匹配的行,这3种模式中的任意一种:
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日";,我设置了一个变量";a";至1
- 在所有行上打印该行;a";为1
- 在线匹配"^[]*21-Sep-20.*6f0747e47829.*oMXskCaN0RWrdfT";,退出(因此停止打印)
添加了一个要求,即如果第二个模式不匹配,则命令不应返回任何内容,我看到的最明显的解决方案是首先为其执行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"来grep开始和结束行-n〃;要获得行号,请使用head和tail(或sed)来获得范围(如果两种模式匹配,则结束>开始)。
第三种方法是使用支持多行正则表达式的编程语言。
让我给您一个问题的一般答案:如何在grep
中创建逻辑表达式?
- OR可以用
grep -E "cond1|cond2"
处理 - AND可用
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"