bash 脚本如何解析输出

bash 脚本如何解析输出

我正在编写一个脚本来测试网络存储的读/写性能,但我需要一些帮助来完成该脚本。

脚本很简单:

  1. 重新加载 nfs 挂载以清除缓存
  2. 将测试文件写入 nfs
  3. 记录时间
  4. 从 nfs 读取测试文件
  5. 记录时间

我还有一个问题需要解决:解析时间命令的输出并将其存储在文本文件中。

时间命令输出三个值:real 0m0.000s user 0m0.000s sys 0m0.000s

我只想要真实的时间。一个文件用于读取,一个文件用于写入。

这是我目前所拥有的:

#!/bin/bash
for i in [`seq 1 20`]; 
echo "remounting autofs"
/etc/init.d/autofs reload;
wait 5;
echo "write test"
#for write perf
do time dd if=/dev/zero of=/home/nfs_perf_testing/samplefile$i bs=1M count=1024 oflag=direct;

echo "write test done";

wait 5;
echo "read test";
#for read perf;
do time dd if=/home/nfs_perf_testing/samplefile of=/dev/null bs=1M count=1024 iflag=direct;

echo "read test done";
done;

谢谢你们

答案1

时间(1)打印到标准错误所以你需要将其输出重定向到标准输出 2>&1,然后将其传输到grep找到你想要的行grep real。最后使用awk打印您想要的列awk '{ print $2 }'

放在一起看起来应该是这样的:

(time command_to_time) 2>&1 | grep real | awk '{ print $2 }'

答案2

没错。很简单。

wait没有达到您的预期。sleep在此处使用。

for i in `seq 1 20` 

省略括号--它们在这里混淆了外壳。

顺便说一句:下次考虑使用 iozone 或 bonnie++。我知道iozone有一个选项可以在测试之间卸载/重新安装 NFS 分区。它还会生成可以导入 EXCEL 并制作漂亮的 3D 图表的数据。它还可以测试各种块大小。

此外,RAM 缓存也可能成为一个问题。您可能需要一个特殊的启动配置(在 grub 中),以便仅使用一定数量的 RAM(例如 1MB)进行启动。请参阅https://stackoverflow.com/questions/13484016/setting-limit-to-total-physical-memory-available-in-linux

答案3

很简单,使用 grep:

{ time command >/dev/null; } |& grep real

这将输出执行“命令”的实际时间

相关内容