Bash 从日志文件中提取文本并将其合并在一起

Bash 从日志文件中提取文本并将其合并在一起,bash,text,grep,Bash,Text,Grep,我需要编写一些用于分析大量日志文件的简单脚本,使用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

我需要编写一些用于分析大量日志文件的简单脚本,使用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,我应该有5个这样的行或N个块,由result.log中的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)列

谢谢你的帮助


James

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

#!/bin/bash

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

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

如果在输入行上需要额外的前导缩进,则可以更改第一个模式,如下所示:

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

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

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行用
    --
  • 每个文件名都用
    ------+------+------+------

通过这种格式,您可以通过管道将其传输到
awk
perl
sed
等等…

是的,@EtanReisner您是对的。修好它。因此,您的评论将成为建设性的。谢谢!是的,它非常适合这种简单的情况,但是你能给我举一些grep+awk更复杂的例子吗case@JamesStarlight你应该更准确地表达你的意思:更复杂的情况?如果这是真的:每个日志文件看起来都像:这是一个简单而好的答案。例如,当我需要从每行提取一些指定的列时,我是否应该通过管道将某些列传输到awk?@JamesStarlight如果你想提取列,你应该:1。)编辑问题2。)问一个新问题。我们不能在一个答案中涵盖所有可能的复杂情况,例如:如果你将矩阵转置,并用彩色列随机写出它。。。
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