【问题标题】:Extract content from file between two same pattern从两个相同模式之间的文件中提取内容
【发布时间】:2017-04-08 16:00:50
【问题描述】:

我有一个日志文件,我需要属于特定类型日志的部分。它可以是多行。
我不能直接在这里发布日志文件,但它的格式如下:

<date-format> Thread-MESSAGE1 random-message
line 1
line 2
line 3
line 4
<date-format> Thread-MESSAGE1 random-message2
line 5
<date-format> Thread-MESSAGE2 random-message3
line 6
line 7
line 8
line 9
<date-format> Thread-MESSAGE3 random-message4
<date-format> Thread-MESSAGE1 random-message5
<date-format> Thread-MESSAGE1 random-message6
line 10
line 11
<date-format> Thread-MESSAGE7 random-message7
<date-format> Thread-MESSAGE8 random-message9
<date-format> Thread-MESSAGE9 random-message10
<date-format> Thread-MESSAGE1 random-message11 

我需要的输出是:

<date-format> Thread-MESSAGE1 random-message
line 1
line 2
line 3
line 4
<date-format> Thread-MESSAGE1 random-message2
line 5
<date-format> Thread-MESSAGE1 random-message5
<date-format> Thread-MESSAGE1 random-message6
line 10
line 11
<date-format> Thread-MESSAGE1 random-message11 

我尝试使用 sed,但使用 'Thread-MESSAGE1' 作为开始和结束模式都不起作用,如果有两个连续的日志带有 'MESSAGE1' 键。
我曾想过使用 Perl 使用负向查找(它有效),但不幸的是我不能使用 Perl,而且 'sed' 和 'awk' 都不支持负向查找模式。
最近我正在尝试使用以下“sed”模式:

tac source_file.log | sed -n '{/<date-format> Thread-/!H; /<date-format> Thread-/{H;d;x} /<date-format> Thread-MESSAGE1/p; d;}' > test.log

这个想法是在之后反转 test.log 的输出,但是为了在 'Thread-/{H;d;x}' 之后添加花括号,我得到了 'extra characters after command' 错误。 有更好的选择吗?或者有没有办法可以在 sed 中使用花括号对命令进行分组?

【问题讨论】:

    标签: regex perl parsing awk sed


    【解决方案1】:

    你可以使用这个 awk 命令:

    awk -v kw='Thread-MESSAGE1' '$2 ~ /^Thread-/ {p = ($2 == kw)} p' file
    
    <date-format> Thread-MESSAGE1 random-message
    line 1
    line 2
    line 3
    line 4
    <date-format> Thread-MESSAGE1 random-message2
    line 5
    <date-format> Thread-MESSAGE1 random-message5
    <date-format> Thread-MESSAGE1 random-message6
    line 10
    line 11
    <date-format> Thread-MESSAGE1 random-message11
    

    如果这不起作用,那么我建议您发布更真实的示例数据。

    【讨论】:

    • 非常感谢。我已验证此命令适用于给定文件。但我只有一个问题,现在 kw='Thread-MESSAGE1' 是一个常量字符串。它也可以有正则表达式吗?
    • 如果你想传入正则表达式,那么在 awk 命令中使用$2 ~ kw 而不是$2 == kw
    猜你喜欢
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 2013-11-26
    • 2016-12-19
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多