【问题标题】:grep : multiline + positive lookaheadgrep : 多行 + 正向前瞻
【发布时间】:2021-04-08 06:34:43
【问题描述】:

我有以下几行:

[37125.641615] CPU3 is up
[37125.643067] ACPI: Waking up from system sleep state S3
[37125.683813] ACPI: EC: interrupt unblocked
[37125.684233] pci 0000:01:00.0: Enabling HDA controller
[37125.714885] ACPI: EC: event unblocked
[37125.714931] usb usb2: root hub lost power or was reset
[37125.714935] usb usb4: root hub lost power or was reset
[37125.715046] ath: phy0: ASPM enabled: 0x42
[37125.715389] usb usb1: root hub lost power or was reset
[37125.716515] usb usb3: root hub lost power or was reset

以下是我要匹配的内容(我希望匹配以 ACPI 开头并以第一个 USB 出现为分隔,USB 出现不得匹配)

ACPI: Waking up from system sleep state S3
[37125.683813] ACPI: EC: interrupt unblocked
[37125.684233] pci 0000:01:00.0: Enabling HDA controller
[37125.714885] ACPI: EC: event unblocked
[37125.714931]

我尝试了以下命令:

grep -izoP  'ACPI.*(?=usb)' ~/tmp/dmesg_grep_test

=> 不匹配,为什么?

然后我使用多行 grep 和正向前瞻尝试了这个命令:

grep -izoP  '(?s)ACPI.*(?=usb)' ~/tmp/dmesg_grep_test 
ACPI: Waking up from system sleep state S3
[37125.683813] ACPI: EC: interrupt unblocked
[37125.684233] pci 0000:01:00.0: Enabling HDA controller
[37125.714885] ACPI: EC: event unblocked
[37125.714931] usb usb2: root hub lost power or was reset
[37125.714935] usb usb4: root hub lost power or was reset
[37125.715046] ath: phy0: ASPM enabled: 0x42
[37125.715389] usb usb1: root hub lost power or was reset
[37125.716515] usb 

结果更好...但它与最后一次出现的“usb”匹配结束。我希望它匹配停止“第一次”出现“usb”。 什么是正确的 grep 命令?

PS:我用一个使用 grep 工具的简单示例来问这个问题。事实上,我正在尝试使用 pdfgrep 在一些 pdf 文件中找到类似的模式(多行 + 正向前瞻)。这就是答案需要使用 grep 工具。 谢谢

【问题讨论】:

    标签: regex grep


    【解决方案1】:

    您可以将此gnu grep 正则表达式与(?s) 或单行模式一起使用:

    grep -izoP '(?s)\bACPI:.*?(?=\susb\b)' file
    
    ACPI: Waking up from system sleep state S3
    [37125.683813] ACPI: EC: interrupt unblocked
    [37125.684233] pci 0000:01:00.0: Enabling HDA controller
    [37125.714885] ACPI: EC: event unblocked
    [37125.714931]
    

    RegEx Demo

    RegEx 解释:

    • (?s):开启单行模式:
    • \b:字边界
    • ACPI: 匹配ACPI:
    • .*?:匹配 0 个或多个任意字符,包括换行符(非贪婪)
    • (?=\susb\b):积极的前瞻性断言我们前面有一个词usb

    【讨论】:

    • 谢谢,完美,刚刚尝试使用较短的版本 grep -izoP '(?s)ACPI:.*?(?=usb)' ,非贪婪是关键!
    猜你喜欢
    • 2020-07-03
    • 2016-12-08
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2016-07-27
    相关资源
    最近更新 更多