0

我对 KornShell (ksh) 很陌生。我有一个项目需要用 ksh 完成。问题是:

请编写一个 ksh 脚本,该脚本将运行“bonnie”基准实用程序并解析输出以获取块写入、块读取和随机搜索/秒的值。还要考虑如何使用这些值与之前测试的结果进行比较。出于本次测试的目的,请限制自己使用标准 GNU 实用程序(sed、awk、grep、cut 等)。

这是“bonnie”实用程序的输出:

# bonnie -s 50M -d /tmp        
File '/tmp/Bonnie.2001096837', size: 52428800
Writing with putc()...done
Rewriting...done
Writing intelligently...done
Reading with getc()...done
Reading intelligently...done
Seeker 1.S.e.eker 2.S.e.eker 3...start 'em...done...done...done...
              -------Sequential Output-------- ---Sequential Input-- --Random--
              -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 

任何有关如何编写此脚本的建议将不胜感激。

谢谢阅读!

4

2 回答 2

0

刚刚在 Shellter 的帮助下得到了答案!

bonnie++\

| awk '/机器/ {f=1;next}f{

   print "#dbg: line_needed=" $0
   printf("blkWrt=%s\t blkRd=%s\t RandSks=%s\n", $4, $8, $12);exit

}'

于 2013-02-26T03:17:19.097 回答
0

这是一个简单的实验解决方案,假设最后一行将始终包含您想要的数据:

 #              -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

于 2013-02-25T22:50:14.343 回答