Bash 从日志文件中提取文本并将其合并在一起
我需要编写一些用于分析大量日志文件的简单脚本,使用grep或awk的组合从每个日志中提取一行(指定的),并将其附加到某个result.log中,其中包含从中提取该行的日志文件的名称。每个日志文件如下所示: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
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