我有一个来自XMPP韵律服务器的文件,该文件将消息记录在一个房间中。该文件如下所示:
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脚本,该脚本将创建如下文件:
Date, Hour, Username, Message
Date, Hour, Username, Message
Date, Hour, Username, Message
以便阅读该讨论会更容易。
这意味着应该为每个项目选择一个
For Date, Hour: ["stamp"]
For username: ["from"]
For message: what is between the first quotes, so for example "Test1" or Test 2\n
我不知道该怎么做。 sed?啊?还有其他东西吗?
答案 0 :(得分:1)
正如所指出的那样,使用sed
,awk
等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