【问题标题】:awk with AND condition on two patterns misses in between lines which don not matchawk 与两个模式的 AND 条件在不匹配的行之间丢失
【发布时间】:2021-01-13 20:30:59
【问题描述】:

输入文件:

    2020-09-24 12:08:18,085.085 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - Benchmarking Data function ENDED
    2020-09-24 12:08:18,085.085 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep -                                                      
    Average_Unit_Price_00         0.000000         Average_Unit_Price
    Competition_Media_00          0.000000          Competition_Media
    2020-09-24 12:08:18,229.229 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - Configure JSON function ENDED
    2020-09-24 12:08:18,302.302 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - Writing into CSV STARTED
    2020-09-24 11:44:03,070.070 ERROR    38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - Traceback (most recent call last):
      File "/usr/local/lib/python3.7/site-packages/pandas/core/indexes/base.py", line 2646, in get_loc
        return self._engine.get_loc(key)
      File "pandas/_libs/hashtable_class_helper.pxi", line 1626, in pandas._libs.hashtable.PyObjectHashTable.get_item
    KeyError: None
    2020-09-24 12:08:18,503.503 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - *************Data Prep Step ENDED*****************
    2020-09-25 07:39:09,008.008 INFO     8ccaf8d81212 LWpHmfMDcu03xp5 J0ps4NHADvsyIFt model2 - model2 Time: 0:00:03.281901 
    2020-09-25 07:39:09,008.008 INFO     8ccaf8d81212 LWpHmfMDcu03xp5 J0ps4NHADvsyIFt model2 -
    2020-09-25 07:39:09,010.010 INFO     8ccaf8d81212 LWpHmfMDcu03xp5 J0ps4NHADvsyIFt model2 - Generating CModel_Meas_Agg STARTED
    2020-09-25 07:39:09,019.019 INFO     8ccaf8d81212 LWpHmfMDcu03xp5 J0ps4NHADvsyIFt model2 - CModel_Meas_All file has 21 observations

命令:

awk '/38210f97f184/&&/94rXXKaa3KLamiJ/' Input_File

预期结果:

    2020-09-24 12:08:18,085.085 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - Benchmarking Data function ENDED
    2020-09-24 12:08:18,085.085 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep -                                                      
    Average_Unit_Price_00         0.000000         Average_Unit_Price
    Competition_Media_00          0.000000          Competition_Media
    2020-09-24 12:08:18,229.229 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - Configure JSON function ENDED
    2020-09-24 12:08:18,302.302 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - Writing into CSV STARTED
    2020-09-24 11:44:03,070.070 ERROR    38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - Traceback (most recent call last):
      File "/usr/local/lib/python3.7/site-packages/pandas/core/indexes/base.py", line 2646, in get_loc
        return self._engine.get_loc(key)
      File "pandas/_libs/hashtable_class_helper.pxi", line 1626, in pandas._libs.hashtable.PyObjectHashTable.get_item
    KeyError: None
2020-09-24 12:08:18,503.503 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - *************Data Prep Step ENDED*****************

【问题讨论】:

  • 添加您的预期输出。
  • 欢迎来到 SO 并感谢您的努力。您能否更清楚您想要哪些线路?您的awk 命令正在检查具有38210f97f18494rXXKaa3KLamiJ 的行,它们应该打印同时具有它们的行,那么有什么不工作的请告诉我们。
  • @RavinderSingh13 是的,我确实需要具有 38210f97f184 和 94rXXKaa3KLamiJ 的行,甚至在匹配模式之间的行之间也需要
  • @90's_jaddu,好的,但是您的预期输出样本不清楚,请修复它并让我们知道。
  • 所以即使在一行中发现了一个模式,你想输出完整的输入文件吗?

标签: linux ubuntu unix awk


【解决方案1】:

编辑:由于 OP 的示例已更改,因此现在添加此解决方案。

awk '
FNR==NR{
  if($0~/38210f97f184.*94rXXKaa3KLamiJ/ && ++count==1){
    start=FNR
  }
  if($0~/38210f97f184.*94rXXKaa3KLamiJ/ && count>1){
    end=FNR
  }
  next
}
FNR>=start && FNR<=end
'  Input_file  Input_file


初始解决方案: 根据 OP 的示例,如果找到匹配的正则表达式的单个实例,它正在寻找打印整行,awk 可以请尝试关注。

awk '
FNR==NR{
  if($0~/38210f97f184 .* 94rXXKaa3KLamiJ/ || $0~ /94rXXKaa3KLamiJ .* 38210f97f184/){
    found=1
  }
  next
}
!found{
  exit
}
1
' Input_file  Input_file

或与 GNU awk:

awk '
FNR==NR{
  if($0~/38210f97f184 .* 94rXXKaa3KLamiJ/ || $0~ /94rXXKaa3KLamiJ .* 38210f97f184/){
    found=1
    nextfile
  }
}
!found{
  exit
}
1
' Input_file  Input_file

解释: 读取 Input_file 2 次。第一次检查是否找到任何一个模式,然后将变量设置为1。在第二次 Input_file 读取时,只需检查是否未设置找到然后退出,否则它将打印整个 Input_file。

【讨论】:

  • 我建议使用 nextfile 而不是 next 来加速
  • 嗨@RavinderSingh13 感谢您的努力和时间,我能够按预期获取结果。再次感谢先生。
  • @anubhava,您好,先生,我认为 OP 需要从具有38210f97f184 .* 94rXXKaa3KLamiJ 的行到具有38210f97f184 .* 94rXXKaa3KLamiJ 的最后一行,如果我在这里理解错误,请告诉我。
  • @90's_jaddu,您能否确认我的上述评论是否正确(关于我对问题的思考)?
  • 公平点。在我看来,OP 有一个日志文件来解析每个日志语句可以是多行的(例如 Java 日志中的堆栈跟踪),并且 OP 想要打印第一行匹配 /38210f97f184/ &amp;&amp; /94rXXKaa3KLamiJ/ 的完整日志语句
【解决方案2】:

您可以使用这个awk 解决方案:

awk '!/^[0-9]{4}(-[0-9]{2}){2} / && p;
/^[0-9]{4}(-[0-9]{2}){2} / && p = (/38210f97f184/ && /94rXXKaa3KLamiJ/)' file
2020-09-24 12:08:18,085.085 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - Benchmarking Data function ENDED
2020-09-24 12:08:18,085.085 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep -
Average_Unit_Price_00         0.000000         Average_Unit_Price
Competition_Media_00          0.000000          Competition_Media
2020-09-24 12:08:18,229.229 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - Configure JSON function ENDED
2020-09-24 12:08:18,302.302 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - Writing into CSV STARTED
2020-09-24 11:44:03,070.070 ERROR    38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/pandas/core/indexes/base.py", line 2646, in get_loc
    return self._engine.get_loc(key)
  File "pandas/_libs/hashtable_class_helper.pxi", line 1626, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: None
2020-09-24 12:08:18,503.503 INFO     38210f97f184 lCpkydbL6wlNNi0 94rXXKaa3KLamiJ prep - *************Data Prep Step ENDED*****************

【讨论】:

  • 它也会返回带有其他不匹配模式的整个文件。
  • 我还有其他模式,例如 {2020-09-24 12:08:18,066.066 INFO 213643876lOlowdnjgdihwi 875jerbkfkdlsdhfli prep - Benchmarking Data function STARTED} 即使是这些与模式不匹配的行也会作为结果出现
  • 但我只想要这些匹配模式之间的数据。直到存在相同匹配模式的行尾。
  • 编辑了问题,希望您可以找出实际输入文件和发布的预期结果的差异,谢谢先生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 2015-08-10
  • 1970-01-01
  • 2023-01-13
  • 2016-12-19
相关资源
最近更新 更多