关闭。这个问题需要details or clarity .它目前不接受答案。
想改进这个问题?通过 editing this post 添加详细信息并澄清问题.
1年前关闭。
Improve this question
egrep AND 条件无法使用以下命令处理日志文件:
我的命令是:
egrep -E "20-Sep-20|^[ ]*|^[ ]*21-Sep-20.*6f0747e47829.*oMXskCaN0RWrdfT" file.log
结果:21-Sep-20 14:30:40.223 DEBUG 6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT prep - ************** END ***************
21-Sep-20 14:30:40.223 INFO 6f0747e47829 QzAJ7ru4ayOWqRm
oMXskCaN0RWrdfT prep - Data Prep Step
ENDED**** 21-Sep-20 14:30:40.273 INFO 6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT prep - dependency step has been removed with step_id = 9l2CDtSl2ZmTOUk 21-Sep-20 14:30:40.439 INFO
6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT prep - Step run completed: success=True 22-Sep-20 14:30:40.500 INFO 6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT prep - dependency step has been removed with step_id = 9l2CDtSl2ZmTOUk 22-Sep-20 14:30:40.560 INFO
6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT prep - Step run completed: success=True 22-Sep-20 14:30:40.600 ERROR 6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT- Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/wiz_task/tasks/modeling/py_module.py", line 55, in run_py_module (success, reports) = instance.execute(project_id, process_id, module_name, step_name, run_params, **kwargs) File "/code/test_module/domkar/py_code/python-attributor/attributor/module.py", line 62, in execute model2_out.main() File "/code/test_module/domkar/py_code/python-attributor/attributor/model/model2.py", line 883, in main model_constr,FixedCoeffTable,planner,Output_data=self.model () File "/code/test_module/domkar/py_code/python-attributor/attributor/model/model2.py", line 503, in model model_constr_res = model_constr_worker.runSingleModel (cmodel_trfm_data_ref, model_constr, False) File "/code/test_module/domkar/py_code/python-attributor/attributor/lib/algo/model_worker.py", line 1283, in runSingleModel model_result = self.runMixedModel (data, model, light_mode) File "/code/test_module/domkar/py_code/python-attributor/attributor/lib/algo/model_worker.py", line 625, in runMixedModel return self.runLinearModel (data, model, light_mode) File "/code/test_module/domkar/py_code/python-attributor/attributor/lib/algo/model_worker.py", line 597, in runLinearModel result.setRetention (DataUtility.retention (data, dep_var, date_var, fixed_vars, model.getHierarchyVars ()) ) File "/code/test_module/domkar/py_code/python-attributor/attributor/lib/data/data_utility.py", line 396, in retention aaaaaaaaaaaaaaaaaaaa NameError: name 'aaaaaaaaaaaaaaaaaaaa' is not defined 23-Sep-20 14:30:40.439 INFO 6f0747e47829 QzAJ7ru4ayOWqRm oMXskCaN0RWrdfT prep - Step run completed: success=True
预期结果:
当给定一个无效的字符串(模式)AND条件失败并仍然返回结果但我需要空结果。因为给定的模式与文件不匹配。
最佳答案
根据您的评论,您正在尝试匹配两个模式之间的所有行。这对于 grep 是不可能的,因为 grep 逐行工作。您可以匹配一行,但到下一行时,grep 无法仅根据它之前是否匹配来知道它是否应该匹配。
您所做的不是“与条件”,我无法理解您的意思。 Perl 正则表达式有一种“AND”子句(称为前瞻),但它的意思是“此时,下一个字符应该匹配这个模式和另一个模式”(前瞻比那个更微妙但我正在简化)。没有办法将它用于你想要的。
为了学习,让我们分析一下你的模式:
20-Sep-20|^[ ]*|^[ ]*21-Sep-20.*6f0747e47829.*oMXskCaN0RWrdfT
|
字符表示“ 或 ”。因此,您正在匹配与以下 3 种模式之一匹配的任何行:20-Sep-20
^[ ]*
^[ ]*21-Sep-20.*6f0747e47829.*oMXskCaN0RWrdfT
第二种模式表示“任何非空格字符在行首任意次数(包括零)”。这符合一切。因此 grep 将匹配您输入的每一行,并按原样输出。您真正想要的是“匹配这一行,后跟任意数量的字符(包括换行符),然后是这一行”。没有“AND”,这是一个单一的模式。但它需要一次应用于多行,而 grep 无法做到这一点。
但是,有一些方法可以使用其他程序来做到这一点。下面是一个 awk 的例子:
awk '/20-Sep-20/ { a=1 } ; { if (a == 1) print } ; /^[ ]*21-Sep-20.*6f0747e47829.*oMXskCaN0RWrdfT/ { exit }' file.log
我在这里做的是逐句声明:如果第二个模式不匹配,命令不应该返回任何内容,我看到的最明显的解决方案是首先对其进行 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 选项“-n” grep 开始行和结束行以获取行号,然后使用 head 和 tail(或 sed)来获取范围(如果两个模式匹配,和结束>开始)。
第三种方法是使用支持多行正则表达式的编程语言。
关于linux - egrep AND 多个模式的条件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64045088/