我的文件中包含多条消息,每条消息都有一个时间戳。我只需要根据其时间戳从文件中提取一条消息。有时,一条消息的内容中会有一个空行。我更喜欢在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
答案 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
这将使用确切的日期和时间作为触发条件,并使所有行以日期格式开始到下一行。