在 Unix 提示符下,如何从匹配模式的文件中提取可变数量的行(可能包括空行)?

At the Unix prompt, how do you pull a variable number of lines (which may include a blank line) from a file matching a pattern?

我的文件中有多条消息,每条消息都有一个时间戳。我需要根据时间戳从文件中提取一条消息。有时,消息的内容中会有一个空行。我更喜欢在 AIX 操作系统的 unix 提示符下执行此操作。

我的文件 (er96aa.example) 包含以下信息。我想拉出时间戳为15:56:10.097的第二条消息(应该是一共4行数据).

07/05/19 15:56:10.091 SOCKETSND MESSAGE LENGTH=338   MESSAGE:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

07/05/19 15:56:10.097 SOCKETSND MESSAGE LENGTH=338   MESSAGE:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

07/05/19 15:56:10.099 SOCKETSND MESSAGE LENGTH=338   MESSAGE:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我试过了

  grep -p '15:56:10.097' er96aa.example 

但只有 returns 前两行。

我试过了

  grep -p'07/05/19' '15:56:10.097' er96aa.example

但是那个returns没什么。

  grep -p'07/05/19'+ '15:56:10.097' er96aa.example   and

  grep -p'07/05/19+' '15:56:10.097' er96aa.example

但是 returns 整个文件

我修改了我的文件并将 07/05/19 放在单独的一行上并且 "grep -p'07/05/19' '15:56:10.097' er96aa.example" 确实有效,但不幸的是我无法修改我通常使用的文件的格式.

预期输出:

07/05/19 15:56:10.097 SOCKETSND
MESSAGE LENGTH=338   MESSAGE:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我无法访问 AIX 机器来测试它,但请尝试:

$ awk '/MESSAGE:/{f=0} /15:56:10.097/{f=1} f' file
07/05/19 15:56:10.097 SOCKETSND MESSAGE LENGTH=338   MESSAGE:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

工作原理

默认情况下,awk 一次读取一行文件。我们的脚本使用单个变量 f 来确定是否应打印当前行。

  • /MESSAGE:/{f=0}

    如果正则表达式 MESSAGE: 出现在当前行,这会将变量 f 设置为假 (0)。

  • /15:56:10.097/{f=1}

    这会将变量 f 设置为真 (1) 是正则表达式 15:56:10.097 出现在当前行。

  • f

    如果 f 为真,打印该行。

Johns 的一些变体 post。

awk '/^[0-9]{2}\/[0-9]{2}\/[0-9]{2}/{f=0} /^07\/05\/19 15:56:10.097/{f=1} f'
07/05/19 15:56:10.097 SOCKETSND MESSAGE LENGTH=338   MESSAGE:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

这使用确切的日期和时间作为触发器并获取以日期格式开头的所有行到下一行。