linux - egrep AND 多个模式的条件不起作用

标签 linux ubuntu unix grep

关闭。这个问题需要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
我在这里做的是逐句声明:
  • 在匹配“20-Sep-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 选项“-n” grep 开始行和结束行以获取行号,然后使用 head 和 tail(或 sed)来获取范围(如果两个模式匹配,和结束>开始)。
    第三种方法是使用支持多行正则表达式的编程语言。

    关于linux - egrep AND 多个模式的条件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64045088/

    相关文章:

    php - 接受 $_GET 变量作为文件路径

    c - 区分文件系统上的文件

    php - 特定网页启动偶尔会导致500内部错误

    c - Linux C 网络通信程序在调试器中有效,但在外部无效

    c - 在 C/UNIX 中扫描内存

    bash - Unix 验证文件没有内容和空行

    unix - 如何解决/var/www复制/写入权限被拒绝的问题?

    php - linux (ubuntu) apache www 文件夹访问问题

    ubuntu : vmlinuz or crash file not a supported file format 上的崩溃转储

    linux - Ubuntu 上的 Azure 用户定义端点无法正常工作