1

我在日志文件中有一个示例数据

节点 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 exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat。

节点 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。

节点 ID> command3

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。

我有一个由顺序命令生成的文件。我不确定如何从日志文件中提取数据

假设我是否需要从文件中提取数据

节点 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 exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat。

最好的方法是什么?我的大部分脚本都是用 shell 脚本编写的,我可以使用 awk 或 sed。请建议

4

4 回答 4

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 }'
于 2012-07-21T15:51:15.907 回答
1

Sed 解决方案

当然可以用 sed 做到这一点。例如,此命令返回后续输出:

$ sed -n '/command1/,/command2/ { /command2/q; p }' /tmp/foo

节点 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 exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat。

于 2012-07-21T16:15:11.647 回答
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 行(与提供的示例数据集/格式一起使用)

于 2012-07-21T16:07:45.150 回答
0

这可能对您有用(GNU sed):

sed '/NODE-ID> command1/!d;n;n;:a;/./!Q;n;ba' file

或者:

sed '/NODE-ID> command1/!d;n;n;q' file

如果该命令仅包含一行文本(根据您的示例)。

于 2012-07-22T07:03:34.987 回答