解析 Lua 文件的脚本

我有一个来自 XMPP Prosody 服务器的文件,记录了一个房间中的消息。这个文件看起来像这样:

item({
    {
        "Test1";
        ["attr"] = {};
        ["name"] = "body";
    };
    {
        ["name"] = "origin-id";
        ["attr"] = {
            ["id"] = "36cface5-e780-4594-b859-03ff635263bc";
            ["xmlns"] = "urn:xmpp:sid:0";
        };
    };
    ["with"] = "message<groupchat";
    ["name"] = "message";
    ["when"] = 1565197939;
    ["key"] = "U5KzbmuUEQN4QCIN";
    ["attr"] = {
        ["stamp_legacy"] = "20190807T17:12:19";
        ["type"] = "groupchat";
        ["to"] = "help@room.myserver.com";
        ["from"] = "help@room.myserver.com/myusername";
        ["id"] = "36cface5-e780-4594-b859-03ff635263bc";
        ["stamp"] = "2019-08-07T17:12:19Z";
        ["xml:lang"] = "en";
    };
});
item({
    {
        "Test 2\n";
        ["attr"] = {};
        ["name"] = "body";
    };
    {
        ["name"] = "origin-id";
        ["attr"] = {
            ["id"] = "fc944764-2fd3-4102-a5d0-1572163baa2b";
            ["xmlns"] = "urn:xmpp:sid:0";
        };
    };
    ["with"] = "message<groupchat";
    ["name"] = "message";
    ["when"] = 1565198050;
    ["key"] = "DH3THj8R4QcIkFsm";
    ["attr"] = {
        ["stamp_legacy"] = "20190807T17:14:10";
        ["type"] = "groupchat";
        ["to"] = "help@room.myserver.com";
        ["from"] = "help@room.myserver.com/myusername";
        ["id"] = "fc944764-2fd3-4102-a5d0-1572163baa2b";
        ["stamp"] = "2019-08-07T17:14:10Z";
        ["xml:lang"] = "en";
    };
});

我想创建一个 bash 脚本来创建一个像这样的文件:

日期、小时、用户名、消息
日期、小时、用户名、消息
日期、小时、用户名、消息

这样更容易阅读讨论。

这意味着它应该为每个项目选择:

对于日期、小时:["stamp"]
对于用户名:["from"]
对于消息:位于第一个引号之间,例如 "Test1" 或 Test 2\n

我不知道如何做到这一点。sed?awk?还是其他什么?

点赞
用户2667536
用户2667536

如先前所述,使用诸如sedawk等的bash命令首先很难,并且其次非常危险:仅当您的数据始终准确地类似于示例时才能正常工作。

我建议使用更高级的工具。但无论如何,仅为练习,以下是一个bash命令,仅在这个特定的示例上完成您想要的内容:

cat you_log_file \
   | grep -E '("stamp")|(^ +")|("from")' \
   | sed -E 's/.*=? "(.*)";/\1@@/g' \
   | paste -d\ - - - - \
   | awk -F@@ '{ print substr($3, 2, 10)","substr($3, 13, 8)","$2","$1 }'

输出:

2019-08-07,17:12:19, help@room.myserver.com/myusername,Test1
2019-08-07,17:14:10, help@room.myserver.com/myusername,Test 2\n
2019-08-08 11:26:06