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

时间:2019-07-06 22:25:34

标签: unix grep aix

我的文件中包含多条消息,每条消息都有一个时间戳。我只需要根据其时间戳从文件中提取一条消息。有时,一条消息的内容中会有一个空行。我更喜欢在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 

但是只会返回前两行。

我尝试过

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

但是什么也不会返回。

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

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

但是会返回整个文件

我修改了文件,然后将19/07/05放在单独的行上,“ grep -p'07 / 05/19''15:56:10.097'er96aa.example”确实起作用了,但不幸的是我没有可以修改我通常使用的文件格式。

预期输出:

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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

2 个答案:

答案 0 :(得分:0)

我无权访问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}

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

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

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

  • f

    如果f为true,则打印该行。

答案 1 :(得分:0)

Johns帖子的一些变化。

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

这将使用确切的日期和时间作为触发条件,并使所有行以日期格式开始到下一行。