You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:07:11