这是一个简单的实验解决方案,假设最后一行将始终包含您想要的数据:
# -Per Char- --Block--- -Rewrite-- -Per Char- --Block--- --Seeks---
# Machine MB K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU /sec %CPU
# 50.0 36112 34.1 138026 1.9 179048 7.0 51361 51.1 312242 4.3 15211.4 10.3
# block write, block read and random seeks/s
bonnie++ \
| awk '
{line=$0}
END{
# print "#dbg:last_line=" $line
split(line, lineArr)
printf ("blkWrt=%s\tblkRd=%s\tRandSks=%s\n", lineArr[4], lineArr[8], lineArr[12])
}' # > bonnieOutput
# ------^^ remove # to write output to file
(请注意,\
bonnie++ 之后的字符必须是该行的最后一个字符,不允许有空格或制表符!!!(否则会爆炸!);-))
awk 读取通过管道传递的所有输入行。当您在 awk 的 END{} 块中时,将读取的最后一行放入 lineArr[],然后使用数据中字段的索引号从该行中打印出您想要的元素,所以lineArr[4]
将返回最后一行数据中的第 4 个字段、lineArr[12]
第 12 个字段等。您可能需要调整使用的索引号来获取要显示的数据。(你必须弄清楚这一点!;-)
要将数据保存到文件,请通过取消注释来使用 shell 重定向(删除 和 之间的字符#
。将字符保留在原位,直到获得所需的输出,然后您可以将其重定向到文件。}'
> bonnieOutput
#
不用说,我使用的标签printf
大多blkWrt=
是用于调试的。一旦您确定需要捕获哪些数据,并且每次都可靠地出现在同一位置,那么您可以删除这些标签,然后您将拥有一个可以与其他程序一起处理的干净数据文件。
请记住,几乎所有 Unix 工具箱实用程序都是面向行的,也就是说,它们希望一次处理 1 行数据,并且通常有一些技巧可以查看正在处理的内容。请注意我在 END{} 块顶部包含的#dbg 行。您必须删除“#”才能取消注释以查看调试输出。
可以做的还有很多,但是如果您想使用 awk 学习 ksh/unix 工具箱,您将不得不花时间了解这些功能是什么。如果您已经阅读了包含您正在处理的问题的章节,并且不了解如何开始解决这个问题,那么您最好再阅读一遍,好吗?;-)
编辑
请注意,在 中awk
,变量$0
包含当前行中的所有文本(由RS
变量值定义,通常是 Unix 行结束字符,\n
)。其他编号的值,即$1
,$2
表示当前行 ( $0
) 上的第一个或第二个“字段”。
根据您在下面评论中的新理解,您希望从包含文本“延迟”的行中提取值。这甚至更容易处理。基本模式将是
bonnie++ \
| awk '
/Latency/{
# print "#dbg:latency_line=" $0
printf ("blkWrt=%s\tblkRd=%s\tRandSks=%s\n", $4, $8, $12)
}' # > bonnieOutput
所以这段代码说,通过管道将 bonnie++ 的所有输出读入 awk,当您找到包含文本“延迟”的行时,使用 printf 格式字符串打印在第 4、第 8 和第 12 字段中找到的值包含自描述标签,如 blkWrt 等。您必须更改 $4 等以正确匹配当前行中每个数据元素的数字。IE 可能是 5 美元、9 美元、13 美元,还是 3 美元、9 美元、24 美元?好的?
请注意,/Latency/ 区分大小写,如果输出中还有其他地方出现该单词,那么我们将不得不修改用于过滤输出的 reg-exp “规则”。
作为一个学习练习,并且作为一个任何 Unix 人每天都在使用的非常基本的工具,跳过 awk,看看你有什么bonnie++| grep 'Latency'
收获。
IHTH