Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 给定行分隔的文本块,如何返回包含特定关键字的每个块?_Linux_Bash_Unix_Grep - Fatal编程技术网

Linux 给定行分隔的文本块,如何返回包含特定关键字的每个块?

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 =

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

例如: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 => 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
    。换句话说,如果一行包含字符串
    Classes:
    ,则返回true,之后包含字符串
    Video
    。如果此条件返回true,则awk执行默认操作,即打印记录(段落)


谢谢!你能解释一下这行到底在做什么吗?我可以把它解释为一个变量正在被设置为要检查。@ksm18我刚刚添加了一个解释。如果你有任何问题,请告诉我。段落模式在POSIX中是标准化的:如果RS为空,则记录由一个加上一个或多个空行的序列分隔,前导或尾随的空行不应在输入的开始或结束处产生空记录,并且a应始终是字段分隔符,无论FS的值是多少。@ninjalj谢谢!很高兴知道。我将把它添加到答案中。在中,我发现“您可以设置“RS”变量来更改AWK对“行”的定义“。如果将其设置为空字符串,那么AWK将把整个文件读入内存。”这让我怀疑旧的AWK可能会有不同的行为。在V7():如果记录分隔符为空,则将一个空输入行作为记录分隔符,空格、制表符和换行符将被视为字段分隔符。有关字段的实际行为是始终将换行符视为字段分隔符,并将FS或空格和制表符视为字段分隔符。
$ 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