我是 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 =”。然后只需打印所需的字段即可