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这个级别的“视频”将返回:
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 编写脚本来对-类和-驱动程序的情况进行排序将是非常简单的,只是询问具体的文本操作。我正在按照grep类的思路思考:*$input,取行号,并从换行符到下一条换行符打印所有内容,但是这会带来更多的复杂性,而且可能不是最有效的方法。
发布于 2015-11-30 22:38:02
要获得Classes...Video:
$ 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测试了它,它应该适用于任何POSIX awk (帽子提示: ninjalj),但它可能与awk的很老的版本不兼容。)
它是如何工作的
-v RS=
这将记录分隔符设置为空字符串,该字符串通常被解释为含义段落。/Classes:[^\n]*Video/
如果记录(段落)包含Classes:,则返回true,后面跟着除换行符以外的任意数量的字符,后面跟着Video。换句话说,如果一行包含字符串Classes:,然后包含字符串Video,则返回true。如果此条件返回true,则awk执行默认操作,即打印记录(段落)。https://stackoverflow.com/questions/34009199
复制相似问题