使用多个分隔符循环单行的最佳方法是什么?
What's the best way to loop over single line with several separator?
我想解析 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"
)
但是,如果您需要 format/extract/compute 来自 fio
输出的内容,那么您应该切换到比 bash 更适合该工作的其他工具。
示例awk
:计算前两列的平均值:
printf '%s' "$fio_result" |
awk -F'|' -v RS='#' '{print (+)/2}'
我想解析 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"
)
但是,如果您需要 format/extract/compute 来自 fio
输出的内容,那么您应该切换到比 bash 更适合该工作的其他工具。
示例awk
:计算前两列的平均值:
printf '%s' "$fio_result" |
awk -F'|' -v RS='#' '{print (+)/2}'