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