Linux 给定行分隔的文本块,如何返回包含特定关键字的每个块?
我如何操作它来返回包含任何给定关键字的块 例如:bash this--class“Video”将返回:Linux 给定行分隔的文本块,如何返回包含特定关键字的每个块?,linux,bash,unix,grep,Linux,Bash,Unix,Grep,我如何操作它来返回包含任何给定关键字的块 例如:bash this--class“Video”将返回: 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 =
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
编写脚本对--class和--driver案例进行排序将是一件小事,只需特别询问文本操作。我按照grep类:$input的思路思考:$input,获取行号,然后打印所有内容,从之前的一个换行到下一个换行,但这样做会更加复杂,可能不是最有效的方法 获取课程…视频:
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),但它可能与awk的版本不兼容。)
工作原理
这将记录分隔符设置为空字符串,该字符串通常被解释为有意义的段落-vrs=
如果记录(段落)为包含/Classes:[^\n]*Video/
,后跟除换行符以外的任意数量的字符,后跟Classes:
。换句话说,如果一行包含字符串Video
,则返回true,之后包含字符串Classes:
。如果此条件返回true,则awk执行默认操作,即打印记录(段落)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