【问题标题】:Forward and reverse search in file after matching string with BASH将字符串与 BASH 匹配后在文件中进行正向和反向搜索
【发布时间】:2014-09-18 02:13:04
【问题描述】:

我有一个包含按顺序运行的测试的大文件。每个测试都有一个测试名称和测试数据。我想过滤掉所有失败的测试到一个单独的文件中。 - 测试名称用方括号括起来。 - 下例中的测试数据是每个测试中的4行 - 如果测试失败,它将包含关键字 FAILED。 这是一个简单的例子:

[CPU]
aaaa
bbbb
cccc
[Drives]
dddd
FAILED eeee
ffff
[Memory]
gggg
hhhh
iiii
[Power]
FAILED jjjj
FAILED kkkk
llll
[Graphics]
mmmm
nnnn
oooo

在此示例中,5 次测试中有 2 次失败,因此输出文件为:

[Drives]
dddd
FAILED eeee
ffff
[Power]
FAILED jjjj
FAILED kkkk
llll

使用 BASH,我可以使用 grep 查找失败的行,但我不知道如何提取包括测试名称在内的完整测试。我在想,在找到与 grep 的匹配项后,我会使用 do while 循环并将每一行输出到文件中,直到找到它上方和下方的 [] 为止。

【问题讨论】:

    标签: bash file loops search grep


    【解决方案1】:

    我首先想到的是非常丑陋的临时文件解决方案:

    split -l 4 --additional-suffix=.txt yourfile.txt tmpfile; grep -C 4 FAILED tmpfile*.txt
    

    这绝对不是最有效的,但特别是如果(如您所写)您想将失败的输出存储在单独的文件中。

    【讨论】:

      【解决方案2】:

      使用 GNU awk:

      gawk -v RS='\\[[^\\]]+\\]' /FAILED/ { printf "%s%s", p, $0 } { p = RT }' file
      

      输出:

      [Drives]
      dddd
      FAILED eeee
      ffff
      [Power]
      FAILED jjjj
      FAILED kkkk
      llll
      

      【讨论】:

      • 还有一个更保守但更长的方法:gawk -v RS='\\[[^\\]]+\\]\n' 'NR > 1 && /FAILED/ { printf "%s%s", p, $0 } { p = RT }' file。如果文件格式永远不同,则没有必要。
      • 谢谢。你有没有机会解释一下,因为我是一个菜鸟并且正在努力理解它?
      【解决方案3】:

      你也可以使用sed命令

      sed ':a;N;/\[.*\]$/{/.*FAILED.*\n/{P;D};D;t};s/\n/-/g;$d;t a;' file_name | sed 's/-/\n/g'
      

      说明:

      N   -- Get the two line and store in the pattern space . 
      t a -- continue the loop and append the line to the pattern space 
      P   -- Print the first line in the pattern space .
      D   -- Delete the first line in the pattern space .
      

      执行方式:

      N 获取两行,t loop 将每一行附加到模式空间中,直到下一个标题块。在标题之后,通过使用替换,所有行都被视为单行。然后执行一些验证,例如如果找到FAILED 模式然后打印直到找到换行符并将其删除,否则删除该行直到换行符,然后继续该过程。完成所有过程,然后用换行符替换每个字段。

      【讨论】:

      • Kalanidhi 你介意在这里或私下向我解释一下,因为我想了解它。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 2021-04-27
      • 2012-09-01
      • 2018-03-10
      • 1970-01-01
      • 2021-08-30
      • 2012-04-11
      相关资源
      最近更新 更多