簡體   English   中英

從日志文件中提取文本並將其合並在一起

[英]Extract text from log files and merge it together

我需要編寫一些簡單的腳本來分析大量的日志文件,使用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個日志,我應該有5N個這樣的行或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)列

感謝幫助,

詹姆士

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

#!/bin/bash

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

從Ed Morton的奇妙答案中我們得到:

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

如果在輸入行上需要額外的前導縮進,則可以更改第一個模式,如下所示:

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行的行用--分隔
  • 每個文件名都用-----+------------+----------+----------分隔

通過這種格式,您可以執行將其管道傳輸到awkperlsed等等的任何操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM