我在日志文件中有一个示例数据
NODE-ID>命令1
Lorem ipsum dolor sit amet,consectetuer adipiscing elit,sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat。 Ut wisi enim ad minim veniam,quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat。
NODE-ID>命令2
Lorem ipsum dolor sit amet,consectetuer adipiscing elit,sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat。 Ut wisi enim ad minim veniam,quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat。
NODE-ID>指令代码
Lorem ipsum dolor sit amet,consectetuer adipiscing elit,sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat。 Ut wisi enim ad minim veniam,quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat。
我有一个由顺序命令生成的文件。我不知道如何从日志文件中提取数据
假设我需要从文件中提取数据
NODE-ID>命令1
Lorem ipsum dolor sit amet,consectetuer adipiscing elit,sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat。 Ut wisi enim ad minim veniam,quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat。
最好的方法是什么?我的大部分脚本都是用shell脚本编写的,我可以使用awk或sed。请建议
答案 0 :(得分:4)
perl -ne 'sub BEGIN { $/="NODE-ID> "; } { if (/^command1/) { s:$/$::; print "$/$_"; }}'
没有sed / awk,但......它有效。
这个是 awk:
awk 'BEGIN { RS="NODE-ID> "; } /^command1/ { print RS $0; }'
在CodeGnome的启发下,我添加了一个sed选项:
sed -n '/^NODE-ID> command1/,/^NODE-ID> / { /^NODE-ID> command1/ { p; d; }; /^NODE-ID> /q; p }'
答案 1 :(得分:1)
使用sed可以做到这一点。例如,此命令返回后续输出:
$ sed -n '/command1/,/command2/ { /command2/q; p }' /tmp/foo
NODE-ID> command1
Lorem ipsum dolor sit amet,consectetuer adipiscing elit,sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat。 Ut wisi enim ad minim veniam,quis nostrud exercation tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat。
答案 2 :(得分:0)
如果您的记录的最后一行中有某些独特内容,例如示例数据中的字符串“consequat”,则此简单 awk
命令将起作用:
awk '/command2/,/consequat/ {print $0}' data.txt
或者,如果记录的长度相同,那么这将起作用:
awk '/command2/{st=NR;for(i=st;i<=st+6;i++){print $0;getline}}' data.txt
在此示例中,它将提取以command2
开头的块并获取接下来的6行(使用提供的样本数据集/格式)
答案 3 :(得分:0)
这可能适合你(GNU sed):
sed '/NODE-ID> command1/!d;n;n;:a;/./!Q;n;ba' file
或:
sed '/NODE-ID> command1/!d;n;n;q' file
如果命令只包含一行文本(根据您的示例)。