2013-02-25 27 views
0

我对KornShell(ksh)很新。我有一个需要用ksh完成的项目。现在的问题是:如何运行程序并使用KornShell解析输出

请写一个的ksh脚本将运行“邦尼”基准 实用性和解析输出抢了块写入值,阻止 读取和随机力求/秒。还要考虑如何使用这些值 与以前的测试结果进行比较。对于 这个测试,请限制自己使用标准的GNU工具(sed,awk, grep,cut等)。

这里是从“邦尼”实用程序输出:

# 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 

如何写这个剧本的任何建议将是很感激。

感谢您的阅读!

+0

你得表现出一些试图解决这个问题,以获取有关计算器的帮助。在这里读到10个用'awk'标记的问题应该有很高的可能性让你指向正确的方向。祝你好运。 – shellter 2013-02-25 19:17:51

+0

非常感谢您的回复,我现在正在阅读“Korn Shell。Unix和Linux编程手册”。并且获得了一些示例代码的乐趣。并且我得到了一些使用awk在txt文件中查找模式的线索。但是我仍然通过如何使用ksh来运行'bonnie'基准测试工具。你有什么想法吗? – 2013-02-25 19:30:49

+0

就我个人而言,我从来没有听说过“邦妮”(但那可能是我的问题)。你知道现在的系统中是否存在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

回答

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 

(请注意,邦妮后\焦炭++必须是行的最后一个字符,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

+0

谢谢soooo提供样品解决方案。现在我更清楚解决这个问题的基本思路。但是我只有最后一个问题,运行Bonnie时,实际上,它不是最后一行,我需要这些值,报告如下所示:http(链接具有正确的输出格式):“// stackoverflow .COM /问题/ 4114706 /在最邦尼 - 基准 - 什么 - 做最延迟对结果表示”。我曾尝试将“{Line = $ 0}”命令更改为“{Line = $ 4}”或“{Line = $ 3}”(任何值但不为0),结果不会改变。您知道我在哪里犯错误? – 2013-02-26 01:44:53

+0

查看最终编辑。任何进一步的谈话都需要一个新的问题。祝你好运。 – shellter 2013-02-26 02:25:55

+0

嘿,谢谢你太多了!这个问题终于解决了!我的代码的最终版本显示为我对这个问题的回答。 :) – 2013-02-26 03:11:58

0

刚从壳牌的帮助下得到了答案!

bonnie++\ 

| AWK '/机械/ {F = 1;接下来} F到{

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

}'

相关问题