【发布时间】:2018-03-07 00:53:49
【问题描述】:
我想从包含 JSON 字符串的日志文件中解析出数据,我想知道是否有办法让我使用 bash 函数来执行任何自定义解析,而不是重载 jq 命令。
命令:
tail errors.log --follow | jq --raw-output '. | [.server_name, .server_port, .request_file] | @tsv'
输出:
8.8.8.8 80 /var/www/domain.com/www/public
我想解析第 3 列以剪切字符串以排除 /var/www/domain.com 部分,其中 /var/www/domain.com 是文档根,/var/www/domain.com/subdomain/public 是网站的公共 html 部分。因此,我想将我的输出保留为/subdomain/public(或来自示例/www/public)。
我想知道我是否可以以某种方式注入 bash 函数来解析 .request_file 列?或者我将如何使用jq 来做到这一点?
我在输出此命令的任何部分的输出时遇到问题,我可以执行任何类型的字符串操作。
【问题讨论】:
-
只有
domain.com,或者你想修剪前三个目录,不管它们是什么?结果第三列应该是www/public还是/www/public?我在回答中做了一些假设,但更好的问题将提供 desired 输出的明确示例,而不仅仅是当前输出。 -
/www/public将是所需的输出。 -
顺便说一句,选项(如
--follow)应始终位于参数之前(如errors.log); GNU 工具允许它反过来,但POSIX utility syntax guidelines 明确表示只保证支持选项优先排序。 -
嗯。这可能会令人困惑,因此如果源是
www.example.com,则期望输出是/subdomain/public,即/www/domain.com。 -
请edit该问题包含一个明确的反例(包括当前输出和所需输出),您担心现有答案可能无法按预期运行。
标签: bash parsing logging jq tail