使用 Awk 进行解析

使用 Awk 进行解析

我是 Ubuntu 的新手,所以很抱歉这个问题已经被问过了,但我想要一种方法来解析具有以下一般格式的文本文件:

-------- step 0  ---- cpu =     Time_value  -------
Energy =  Energy_value1   KinEng = KinEng_value1 Temp = Temp_value1

-------- step 10 ---- cpu =     Time_value  -------
Energy =  Energy_value2   KinEng = KinEng_value2 Temp = Temp_value2

具体来说,我试图弄清楚如何使用 awk 和/或 grep 提取时间值和 temp_value 并将它们以单独的列形式输出到文件中,以便

Time_value1 Temp_value1
Time_value2 Temp_value2
etc...

查找 awk 文档后,我发现这awk '/Temp/ {print $9}' file_name会给我 temp 值,并且awk '/cpu/ {print $7}' file_name应该会给我 time_value,但是如何在一个命令中搜索两个字符串,同时在不同的列中搜索它们各自的字符串。换句话说,我如何修改行awk '/cpu|sec/ {print}' file_name以包含每个字符串的列信息。

@steeldriver:说实话,由于其格式,文本文件在实际编辑器中更难读取,但我会附上其“最干净”视图的屏幕截图。

在此处输入图片描述

答案1

awk想要的应该如下:

awk -F '=' '/^-/{gsub(/\-*$/,"",$2);print $2}' input.txt

这里的想法是,我们使用=(或用 awk 术语来说 - 字段 )分隔符。因此,在包含 CPU 时间的所需行中,只有一个=,这将使左侧字段$1和右侧的所有内容都变成 - $2

之后就是简单的/PATTERN/ {ACTION}结构了。只有符合以破折号开头的模式的行,结尾的破折号才会被截断,剩下的就是 CPU 时间。

答案2

您的“单位”由 5 条线组成。在这种情况下,以下做法可能会有用:

awk '{print $1, $11}' RS="cpu =" logfile

其中RS="cpu ="将记录分隔符 (RS) 重新定义为“cpu =”。然后只需打印所需的字段即可

相关内容