如何在Bash中解析日志文件并提取指定格式数据?
问题:Bash日志文件格式转换
我是Bash新手,有一个名为file.log的输入文件,内容如下:
ok: [test_performance=10.50.100.82] => { "msg": [ [ "DeviceName:78BAY08V2A/10", "DeviceName:GH7AK1A02097/10" ]]} ok: [test_1=10.50.101.84] => { "msg": [ [ "DeviceName:8K251FDD4000D1/13", "DeviceName:99071JEGR10369/12" ]]}
我想要得到如下格式的输出:
test_performance,10.50.100.82,78BAY08V2A/10 test_performance,10.50.100.82,GH7AK1A02097/10 test_1,10.50.101.84,8K251FDD4000D1/13 test_1,10.50.101.84,99071JEGR10369/12
我尝试了以下命令但无法正常工作,请问该怎么解决?
grep -C 3 "DeviceName:" file.log | xargs | sed 's/ok/\n/g' | sed 's|[]{}[]||g' | sed 's/msg//g' | sed 's/ =>/,/g' | awk -F ":" '{print $4,$5}' | awk -F "--" '{print $1}' | sed 's/, /,/g' | sed 's/, /-/g' | sed 's/ //g' | grep -E 'arda|kobra|pipeline|performance|integration|feature|kare|yjr' | sed 's/=/,/g' | sed 's/\(.*\)-/\1,/' | sed 's/-/,/g' | tee -a file2.csv
解决方案
可以用awk一次性处理,逻辑更清晰,避免多个管道命令的混乱,命令如下:
awk ' /ok:/ { split($2, arr, /\[|=|\]/) test_name = arr[2] ip = arr[3] } /DeviceName:/ { split($0, dev, /"|:/) dev_name = dev[4] print test_name "," ip "," dev_name } ' file.log > file2.csv
命令逻辑说明:
- 匹配到
ok:行时,用split函数拆分该行的第二个字段([test_performance=10.50.100.82]),以[、=、]作为分隔符,提取出测试名称和IP地址,保存到变量中。 - 匹配到
DeviceName:行时,拆分该行内容,以双引号和冒号作为分隔符,提取设备名称,然后将测试名称、IP、设备名称用逗号拼接输出。 - 最后将结果直接写入
file2.csv文件。
这种方式比原命令简洁易读,也更容易调试和修改,适合Bash新手理解使用。
内容的提问来源于stack exchange,提问作者snigdha singh
相关产品推荐
相关产品推荐

