【问题标题】:Given line separated blocks of text, how can I return each block which contains a specific keyword?给定行分隔的文本块,如何返回包含特定关键字的每个块?
【发布时间】:2015-11-30 22:27:11
【问题描述】:
me$ cat file.txt

Filename: 1
Organization: Bus 1 => Port 1 => Subport 1 => Device 3
Classes: Interface Video
Drivers: usbhid

Filename: 2
Organization: Bus 1 => Port 1 => Subport 3 => Device 4
Classes: Audio 
Drivers: usb-audio uvc Video

Filename: 3
Organization: Bus 1 => Port 1 => Subport 4 => Device 5
Classes: Wireless Video
Drivers: uvc  

如何操作它以返回包含任何给定关键字的块?

例如:bash this --class "Video" 会返回:

Filename: 1
Organization: Bus 1 => Port 1 => Subport 1 => Device 3
Classes: Interface Video
Drivers: usbhid

Filename: 3
Organization: Bus 1 => Port 1 => Subport 4 => Device 5
Classes: Wireless Video
Drivers: uvc  

编写脚本来对 --class 和 --driver 情况进行排序很简单,只需特别询问文本操作。我正在考虑 grep Class:*$input 的思路,获取行号,然后从换行到下一个换行打印所有内容,但这会带来更多复杂性,并且可能不是最有效的方法做。

【问题讨论】:

    标签: linux bash unix grep


    【解决方案1】:

    获取课程...视频:

    $ awk -v RS= '/Classes:[^\n]*Video/' file.txt
    Filename: 1
    Organization: Bus 1 => Port 1 => Subport 1 => Device 3
    Classes: Interface Video
    Drivers: usbhid
    Filename: 3
    Organization: Bus 1 => Port 1 => Subport 4 => Device 5
    Classes: Wireless Video
    Drivers: uvc  
    

    (我使用 mawk 和 GNU awk 对此进行了测试,它应该适用于任何 POSIX awk [帽子提示:ninjalj),但它可能与 very old versions of awk 不兼容。)

    工作原理

    • -v RS=

      这将记录分隔符设置为一个空字符串,通常被解释为有意义的段落。

    • /Classes:[^\n]*Video/

      如果记录(段落)包含Classes:,后跟除换行符以外的任意数量的任何字符,然后是Video,则返回true。换句话说,如果 一行 包含字符串 Classes: 并且稍后包含字符串 Video,则返回 true。如果此条件返回 true,则 awk 执行默认操作,即打印记录(段落)。

    【讨论】:

    • 谢谢!你能解释一下这条线到底在做什么吗?我可以将其解释为正在设置要检查的变量。
    • @ksm18 我刚刚添加了一个解释。如果您有任何问题,请告诉我。
    • 段落模式在 POSIX 中标准化: 如果 RS 为空,则记录由 加上一个或多个空行组成的序列分隔,不应产生前导或尾随空行在输入的开头或结尾的空记录中,并且 应始终是字段分隔符,无论 FS 的值是什么。
    • @ninjalj 谢谢!很高兴知道。我会将其添加到答案中。在Grymoire's tutorial,我发现这个“你可以设置“RS”变量来改变AWK对“行”的定义。如果你把它设置为一个空字符串,那么AWK会将整个文件读入内存。” 这让我怀疑旧的 awk 可能会有不同的行为。
    • 在 V7 (plan9.bell-labs.com/7thEdMan/vol2/awk) 中:如果记录分隔符为空,则将空输入行作为记录分隔符,并将空格、制表符和换行符视为字段分隔符。 关于字段的实际行为是始终将换行符视为字段分隔符,并将 FS、空格和制表符视为字段分隔符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多