如何在Bash脚本中将磁盘I/O性能输出重定向为CSV文件
我来帮你搞定这个转换需求!你的原始输出是单行包含三个测试结果,我们需要把它拆成CSV的三条记录,对应每个测试类型。这里有个用awk实现的方案,简单高效,能直接处理你的输入文本并生成符合要求的CSV:
转换脚本
awk ' # 先输出CSV表头 BEGIN { print "Date-time,Filename (being tested),Filesize,Test type,Speed" } # 处理每一行输入 { # 提取固定位置的基础字段 datetime = $1 filesize = $3 $4 # 拼接数值和单位(比如250+KB) filename = $6 # dir后面的测试文件路径 # 处理WRITE TEST记录 write_test = "WRITE TEST" write_speed = $9 $10 print datetime "," filename "," filesize "," write_test "," write_speed # 处理READ TEST (W/O CACHE)记录 read_nocache_test = "READ TEST (W/O CACHE)" read_nocache_speed = $14 $15 print datetime "," filename "," filesize "," read_nocache_test "," read_nocache_speed # 处理READ TEST (WITH CACHE)记录 read_cache_test = "READ TEST (WITH CACHE)" read_cache_speed = $19 $20 print datetime "," filename "," filesize "," read_cache_test "," read_cache_speed }' input.txt > output.csv
脚本说明
- BEGIN块:先输出指定的CSV表头,确保第一行是要求的列名。
- 字段提取:根据你给出的输出格式,固定提取对应位置的字段:
$1是时间戳(Date-time)$3$4拼接文件大小的数值和单位(比如250KB)$6是测试文件的路径(Filename)
- 拆分测试记录:把单行里的三个测试结果拆成三条独立的CSV行,分别对应不同的测试类型和速度值。
示例输出
运行脚本后,output.csv的内容会是:
Date-time,Filename (being tested),Filesize,Test type,Speed 2018-04-18-12-09-32,/opt/testfile,250KB,WRITE TEST,116 MB/s 2018-04-18-12-09-32,/opt/testfile,250KB,READ TEST (W/O CACHE),350 MB/s 2018-04-18-12-09-32,/opt/testfile,250KB,READ TEST (WITH CACHE),657 MB/s
如果后续你的原始输出格式有微小调整(比如文件大小单位变化、字段位置偏移),只需要修改脚本里对应的$N数值即可。
内容的提问来源于stack exchange,提问作者Nirbhay Singh
相关产品推荐
相关产品推荐

