【问题标题】:AWK: get second block of text from text fileAWK:从文本文件中获取第二个文本块
【发布时间】:2020-12-16 20:54:11
【问题描述】:

我正在开展一个项目,以从 Linux 服务器上的日志文件中提取特定的文本块。我遇到的问题是第二次出现文本块。我们的系统运行一个校正程序并根据需要更改数字,因此第一个块具有未校正的值,而我真正想要的第二个块具有校正值。

请参阅下面两个文本块的示例。请注意,“Recs”和“Count”数字在第二个块上减 1(用于更正值)。此外,第一个和第二个(所需的)块由随机的命令输出行分隔,每个月都会发生变化。

使用 awk,我能够使用此命令提取第一个块,该命令匹配“报告输出摘要”和“所有部门总计”之间的所有内容:

awk '/Report output summary/{prnt=1} prnt{print} /Grand Total All Depts/{exit}'
Report output summary:
Department                         Type      Recs  Count          Amount
---------------------------------- ------  ------ ------ ---------------
002 FACILITIES                     Check        4      2      560,819.78

005 HUMAN RESOURCES                Check       13      8       10,688.84

010 TECHNOLOGY                     Check       94     25       78,211.24

050 TRANSPORTATION                 Check       73     27      120,350.32


Grand Total All Depts              Check      906    385       80,365.69


Random lines of text1
Random lines of text2
Random lines of text2
Random lines of text2
Random lines of text2
Random lines of text2


Report output summary:
Department                         Type      Recs  Count          Amount
---------------------------------- ------  ------ ------ ---------------
002 FACILITIES                     Check        4      2      560,819.78

005 HUMAN RESOURCES                Check       13      8       10,688.84

010 TECHNOLOGY                     Check       94     25       78,211.24

050 TRANSPORTATION                 Check       72     26       90,222.15


Grand Total All Depts              Check      906    385       80,365.69

有人可以通过提供有关如何仅返回第二个文本块的提示来使我免于进一步的痛苦。 (不要注意不正确的总计,因为我将数字更改为示例的假值。) 感谢您的帮助!

【问题讨论】:

    标签: bash awk sed grep


    【解决方案1】:

    你可以像这样使用一个有趣的工具tac

    $ tac FILE | awk '/Grand Total All Depts/{prnt=1} prnt{print} /Report output summary/{exit}' | tac
    Report output summary:
    Department                         Type      Recs  Count          Amount
    ---------------------------------- ------  ------ ------ ---------------
    002 FACILITIES                     Check        4      2      560,819.78
    
    005 HUMAN RESOURCES                Check       13      8       10,688.84
    
    010 TECHNOLOGY                     Check       94     25       78,211.24
    
    050 TRANSPORTATION                 Check       72     26       90,222.15
    
    
    Grand Total All Depts              Check      906    385       80,365.69
    

    【讨论】:

    • 感谢@arkadiusz-drabczyk。从来没有听说过tac,但这对我有用。很高兴我现在知道了。非常感谢!
    • 如果您喜欢这个答案,请将其标记为已解决,让其他用户知道您的问题已解决。另见What should I do when someone answers my question?
    【解决方案2】:

    您可以使用此awk 打印具有给定开始/结束行的第二个块:

    awk '/Report output summary/{++n} n==2; /Grand Total All Depts/ && n==2{exit}' file
    
    Report output summary:
    Department                         Type      Recs  Count          Amount
    ---------------------------------- ------  ------ ------ ---------------
    002 FACILITIES                     Check        4      2      560,819.78
    
    005 HUMAN RESOURCES                Check       13      8       10,688.84
    
    010 TECHNOLOGY                     Check       94     25       78,211.24
    
    050 TRANSPORTATION                 Check       72     26       90,222.15
    
    
    Grand Total All Depts              Check      906    385       80,365.69
    

    【讨论】:

    • 谢谢@anubhava。我的生产环境中一定有一些奇怪的东西,由于某种原因,awk 对我不起作用。我最终使用了“tac”。
    • 它也适用于 POSIX awk。检查这个工作演示:ideone.com/4z88Gd
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多