求助 Linux 下数据提取收集问题。

2018-03-02 09:42:45 +08:00
 E1n

请教一个问题,meclog 得到数据文件格式如下:
app10:
app11:
        Hardware event. This is not a software error.
        MCE 0
        CPU 0 BANK 9
        MISC 90841000100128c ADDR c2e60a000
        ...
app20:
app30:
        Hardware event. This is not a software error.
        MCE 0
        CPU 0 BANK 9
        MISC 90841000100128c ADDR c2e60a000
        ....
有什么方法,可以提取出有数据内容的主机,创建文本名为主机名,写入对应的数据。
求助有没有好的思路,谢谢各位!

2537 次点击
所在节点    Linux
9 条回复
anjing01
2018-03-02 11:50:32 +08:00
假设机器名是 app 开头的从 10-30,假设有内容主机数据行数都一样,可以这样写:
#!/bin/bash

for i in app{10..30};
do
j=`grep $i meclog -A1|grep -v app|wc -l`
if [ "$j" == 1 ]
then
touch $i
grep $i meclog -A4|grep -v $i >$i
fi
done
anjing01
2018-03-02 11:54:18 +08:00
上面是笨法子,
如果主机名比较随意,内容也比较随意,那就更笨的法子,先筛选出来所有的主机名,记录行号,根据行号信息判断是否有内容,有的话 touch 文件,然后 sed 打印对应行号内容写入文件。

请大神给出好更加优化的法子
pkookp8
2018-03-02 12:43:59 +08:00
shell 不太会写
这样可不可以,先用正则匹配
^.+:\n(\S+\n)*(\S+\n)替换成$2

然后一行行读,读到空行就新起文件
E1n
2018-03-02 13:08:17 +08:00
@pkookp8 这正则我看看,不是很懂。。
E1n
2018-03-02 13:08:41 +08:00
@anjing01 我试试,感谢回复!
pkookp8
2018-03-02 15:33:55 +08:00
@pkookp8 把类似于 xxx 冒号换行后面跟着非空字符的分组,替换成最后一组。
就是去掉无效行
linyinma
2018-03-05 13:19:38 +08:00
perl -ne 'if(/^(\S+):/) {open(FILE, ">", $1);}else {print FILE;};' meclog
E1n
2018-03-06 00:19:08 +08:00
@linyinma 提取很准确,十分感谢! perl 很好用,想学习下有什么好的建议吗。。
E1n
2019-05-16 15:07:19 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/434130

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX