这里有一个简单的解决方案进行实验,即假定最后一行将始终包含你想要的数据:
# -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
(请注意,邦妮后\
焦炭++必须是行的最后一个字符,NO允许空格或者标签!!!(否则会炸掉!);-))
Awk读取通过管道传递的所有行。当你在awk的END {}块中时,将最后一行读入lineArr [],然后使用数据中字段的索引号打印出该行所需的元素,所以lineArr[4]
将返回最后一行数据中的第4个字段,lineArr[12]
,第12个等。您可能需要调整用于获取要显示的数据的索引号。 (你必须明白这一点!;-)
将数据保存到一个文件中,取消注释(除去}'
和> bonnieOutput
之间的#
字符使用shell重定向。离开#
焦炭到位,直到你你需要的输出,然后你可以将它重定向到一个文件
不用说,我在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
所以这个代码表示,读取邦尼++所有输出到awk中,通过管道,当你发现包含文本“延迟”一条线,打印4找到的值,第8和第12个字段,使用包含自描述标记(如blkWrt等)的printf格式字符串。 您必须更改$ 4等才能正确匹配每个数据元素的当前行中的数字。 I.E.也许它是5美元,9美元,13美元,或3美元,9美元,24美元?好?
请注意,/ Latency /区分大小写,如果输出中出现其他位置出现该单词,则必须修改用于过滤输出的reg-exp“规则”。
作为一种学习练习,并且作为任何Unix用户每天都在使用的非常基本的工具,请跳过awk,然后看看bonnie++| grep 'Latency'
能为您带来什么。
IHTH
你得表现出一些试图解决这个问题,以获取有关计算器的帮助。在这里读到10个用'awk'标记的问题应该有很高的可能性让你指向正确的方向。祝你好运。 – shellter 2013-02-25 19:17:51
非常感谢您的回复,我现在正在阅读“Korn Shell。Unix和Linux编程手册”。并且获得了一些示例代码的乐趣。并且我得到了一些使用awk在txt文件中查找模式的线索。但是我仍然通过如何使用ksh来运行'bonnie'基准测试工具。你有什么想法吗? – 2013-02-25 19:30:49
就我个人而言,我从来没有听说过“邦妮”(但那可能是我的问题)。你知道现在的系统中是否存在bonnie基准?如果从命令行运行'bonnie'会返回'command not found'(或类似命令),并且您确定它应该在您的系统上,那么您将发出cmd'find。名bonnie'。如果返回字符串如'/ path/to/alt/dir/bonnie',则执行PATH =“$ PATH:/ path/to/alt/dir”并重新运行bonnie。然后你会得到一些输出。你应该在你的主要问题中引用你的书名,也许用一个页面#。祝你好运。 – shellter 2013-02-25 19:35:50