使用多个分隔符循环单行的最佳方法是什么?



我想解析fio的输出,我已经格式化了它们,这样它就有了一个很好的分隔符。

182.07 MB/s|182.55 MB/s|364.62 MB/s|45.5k|45.6k|91.2k#682.65 MB/s|686.24 MB/s|1.36 GB/s|10.7k|10.7k|21.4k#665.21 MB/s|700.56 MB/s|1.36 GB/s|1.3k|1.4k|2.7k#751.97 MB/s|802.05 MB/s|1.55 GB/s|0.7k|0.8k|1.5k

我想处理每个用#符号分隔的字符串,目前这就是我所做的

  • #转换为n(换行(

    fio_result=$(printf %s "$fio_result" | tr '#' 'n')
    

    这将像这样输出字符串。

    182.07 MB/s|182.55 MB/s|364.62 MB/s|45.5k|45.6k|91.2k
    682.65 MB/s|686.24 MB/s|1.36 GB/s|10.7k|10.7k|21.4k
    665.21 MB/s|700.56 MB/s|1.36 GB/s|1.3k|1.4k|2.7k
    751.97 MB/s|802.05 MB/s|1.55 GB/s|0.7k|0.8k|1.5k
    
  • 只有在那之后,才能循环使用变量fio_result

    echo "$fio_result" | while IFS='|' read -r bla bla...
    

有人更清楚如何实现我想要的吗?

使用bash可以执行以下操作:

#!/bin/bash
fio_result='182.07 MB/s|182.55 MB/s|364.62 MB/s|45.5k|45.6k|91.2k#682.65 MB/s|686.24 MB/s|1.36 GB/s|10.7k|10.7k|21.4k#665.21 MB/s|700.56 MB/s|1.36 GB/s|1.3k|1.4k|2.7k#751.97 MB/s|802.05 MB/s|1.55 GB/s|0.7k|0.8k|1.5k'
while IFS='|' read -d '#' -ra arr
do
declare -p arr #=> shows what's inside 'arr'
done < <(
printf '%s' "$fio_result"
)

但是,如果您需要从fio输出中格式化/提取/计算某些内容,那么您应该切换到比bash更适合此工作的其他工具。

awk示例:计算前两列的平均值:

printf '%s' "$fio_result" |
awk -F'|' -v RS='#' '{print ($1+$2)/2}'

相关内容

  • 没有找到相关文章

最新更新