代码之家  ›  专栏  ›  技术社区  ›  amadain

只有当文件节中的一行包含某个字符串时,才能在两个正则表达式之间打印文件节

  •  3
  • amadain  · 技术社区  · 14 年前

    我有一个事件文件,其中有多个多行事件 <event> </event> 标签。我想打印出整个活动 <事件GT; </事件& GT; 仅当该事件中的一行包含字符串uniqueid=“127993300.862594_pfm_1_1912320699”或uniqueid=“1281686522.353435_pfm_1_988171542”时。文件中有100000个事件,每个事件有20到35行(事件中的属性长度不同)。我刚开始使用SED,但需要一些帮助:

    cat xmlEventLog_2010-03-23T* | sed -nr "/<event eventTimestamp/,/<\/event>/"
    

    我需要做什么来完成这个?考虑到文件的大小,SED是实现这一点的最佳方法吗?

    提前谢谢

    我想编辑这个更新。出于某些原因,我想和塞德一起做这件事。我试过丹尼斯的解决方案,但似乎不起作用:

    bash$ grep 1279939300.862594_PFM_1_1912320699 xmlEventLog*
    xmlEventLog_2010-03-23T02:41:15_PFM_1_1.xml:    <event eventTimestamp="2010-03-23T02:41:40.861" originalReceivedMessageSize="0" uniqueId="1279939300.862594_PFM_1_1912320699">
    bash$ grep 1281686522.353435_PFM_1_988171542 xmlEventLog*
    xmlEventLog_2010-03-23T07:47:38_PFM_1_1.xml:    <event eventTimestamp="2010-03-23T08:02:02.299" originalReceivedMessageSize="685" uniqueId="1281686522.353435_PFM_1_988171542">
    bash$ time sed -n ':a; /<event>/,/<\/event>/ N; /<event>/,/<\/event>/!b; /<\/event>/ {/uniqueId="1279939300.862594_PFM_1_1912320699"\|uniqueId="1281686522.353435_PFM_1_988171542"/p;d}; ba' xmlEventLog*
    
    real    1m13.134s
    user    1m12.463s
    sys     0m0.659s
    bash$
    

    显然什么也没有。那么,有没有可能用SED来实现这一点呢?

    3 回复  |  直到 13 年前
        1
  •  1
  •   Dennis Williamson    14 年前

    尝试一下:

    sed -n ':a; /<event>/,/<\/event>/ N; /<event>/,/<\/event>/!b; /<\/event>/ {/uniqueId="1279939300.862594_PFM_1_1912320699"\|uniqueId="1281686522.353435_PFM_1_988171542"/p;d}; ba'
    
        2
  •  2
  •   ghostdog74    14 年前
    awk -vRS="</event>" '/<event>/ && /1279939300.862594_PFM_1_1912320699|1281686522.353435_PFM_1_988171542/{print}' file
    
        3
  •  0
  •   Ryan Brunner    14 年前

    您应该能够使用 | 允许唯一ID的字符。我做了一个快速测试,下面的正则表达式似乎找到了正确的条目:

     <event.*?uniqueid=("1279939300\.862594_PFM_1_1912320699"|"1281686522\.353435_PFM_1_988171542").*?</event>