【问题标题】:Extract text from log files and merge it together从日志文件中提取文本并将其合并在一起
【发布时间】:2014-09-17 13:51:29
【问题描述】:

我需要编写一些简单的脚本来分析大量日志文件,使用 grep 或 awk 的组合从每个日志中提取一个(指定)行并将其附加到一些带有名称的 result.log从中提取该行的日志文件。每个日志文件如下所示:

Detected 8 CPUs
Reading input ... done.
Setting up the scoring function ... done.

mode |   affinity | dist from best mode
     | (kcal/mol) | rmsd l.b.| rmsd u.b.
-----+------------+----------+----------
   1         -6.8      0.000      0.000
   2         -6.4      8.197     10.006
   3         -5.9      1.227      2.791
   4         -5.6      1.551      3.947
   5         -5.2      1.061      3.325
   6         -5.1      1.055      4.219
   7         -4.4      2.000      3.318
   8         -3.9      1.110      3.362
   9         -3.8      1.460      4.123
  10         -2.4      6.960      9.282
  11         -2.2      1.277      4.038
  12         -1.9      1.758      4.043
  13          3.1      2.144      4.284
Writing output ... done.

我只需要从中提取前 5 行,包括

1         -6.8      0.000      0.000
2         -6.4      8.197     10.006
3         -5.9      1.227      2.791
4         -5.6      1.551      3.947
5         -5.2      1.061      3.325

并将其附加到 result.log 中,如下所示:

   From file name1.log
       1         -6.8      0.000      0.000
       2         -6.4      8.197     10.006
       3         -5.9      1.227      2.791
       4         -5.6      1.551      3.947
       5         -5.2      1.061      3.325

  From file name2.log
       1         -6.8      0.000      0.000
       2         -6.4      8.197     10.006
       3         -5.9      1.227      2.791
       4         -5.6      1.551      3.947
       5         -5.2      1.061      3.325

所以对于 N log 我应该在 result.log 中有 5N 个这样的行或 N 个由 5 个排名分数组成的块

脚本循环所有日志的想法=

#!/bin/bash

for log in ./*.log2; do
  filename=$(basename "$log")
  filenamenoextention=${filename/.log/}
  #some command to extract of the line and put it to the final_results.txt
done

所以我只需要知道 grep 或 sed(从每个日志中查找 5 行)和 (mb) awk 的组合来提取选定的(例如只有 1 和 2)列

感谢您的帮助,

詹姆斯

【问题讨论】:

    标签: bash text grep


    【解决方案1】:

    如果您要提取的日志文件的行总是相同的,您可以执行以下操作:

    #!/bin/bash
    
    for log in ./*.log2; do
      echo "From $log" >> result.log
      head -n 12 "$log"|tail -n 5 >> result.log
    done
    

    【讨论】:

    • 是的,@EtanReisner 你是对的。修理它。所以你的评论会变得有建设性。
    • 谢谢!是的,它非常适合这种简单的情况,但是你能不能给我看一些 grep + awk 的例子来处理更复杂的情况
    • @JamesStarlight 您应该更准确地说出您的意思:更复杂的情况?如果这是真的:每个日志文件看起来像:这是一个简单而好的答案。
    • 例如,当我需要从每行中提取一些指定的列时,我应该通过管道将一些东西传递给 awk 吗?
    • @JamesStarlight 如果您想提取列 - 您应该:1.) 编辑问题 2.) 提出新问题。我们无法在一个答案中涵盖所有可能的并发症,例如:如果您要转置矩阵并使用彩色列以随机顺序写出它...
    【解决方案2】:

    从 Ed Morton 的精彩回答 here 我们得到:

    awk 'c&&c--;/^-----+/{print "From file "FILENAME; c=5}' name1.log name2.log ... > result.log
    

    如果您在输入行上需要额外的前导缩进,那么您可以像这样更改第一个模式:

    c&&c--{printf "    ";print};
    

    【讨论】:

      【解决方案3】:

      如果标题中的行数可能不一样,您也可以使用下一个:

      grep -A5 -He '^----' *.log2 |
          sed -E 's/(.*)\.log2:-{5}.*/From file \1/;s/^[^-]+-//;/^--$/d' >result.log
      

      打印:

      From file c1
         1         -6.8      0.000      0.000
         2         -6.4      8.197     10.006
         3         -5.9      1.227      2.791
         4         -5.6      1.551      3.947
         5         -5.2      1.061      3.325
      From file d
         1         -6.8      0.000      0.000
         2         -6.4      8.197     10.006
         3         -5.9      1.227      2.791
         4         -5.6      1.551      3.947
         5         -5.2      1.061      3.325
      From file e
         1         -6.8      0.000      0.000
         2         -6.4      8.197     10.006
         3         -5.9      1.227      2.791
         4         -5.6      1.551      3.947
         5         -5.2      1.061      3.325
      

      您的基本命令可能是:

      grep -A5 -He '^----' *.log2
      

      在表单中打印所需信息的内容:

      c1.log2:-----+------------+----------+----------
      c1.log2-   1         -6.8      0.000      0.000
      c1.log2-   2         -6.4      8.197     10.006
      c1.log2-   3         -5.9      1.227      2.791
      c1.log2-   4         -5.6      1.551      3.947
      c1.log2-   5         -5.2      1.061      3.325
      --
      d.log2:-----+------------+----------+----------
      d.log2-   1         -6.8      0.000      0.000
      d.log2-   2         -6.4      8.197     10.006
      d.log2-   3         -5.9      1.227      2.791
      d.log2-   4         -5.6      1.551      3.947
      d.log2-   5         -5.2      1.061      3.325
      --
      e.log2:-----+------------+----------+----------
      e.log2-   1         -6.8      0.000      0.000
      e.log2-   2         -6.4      8.197     10.006
      e.log2-   3         -5.9      1.227      2.791
      e.log2-   4         -5.6      1.551      3.947
      e.log2-   5         -5.2      1.061      3.325
      

      例如,在哪里

      • 每一行都以来自哪里的文件名作为前缀,以便于操作,
      • 每块5行用--分隔
      • 每个文件名都用-----+------------+----------+----------分隔

      通过这种格式,您可以通过管道将其发送到awkperlsed 等等...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-21
        • 2013-03-23
        • 2021-02-13
        • 1970-01-01
        • 2015-12-18
        • 1970-01-01
        相关资源
        最近更新 更多