【发布时间】:2018-04-12 06:48:06
【问题描述】:
您好,我有一个日志文件,我正在执行这样的 grep 操作。
cat logfile | grep select
2018-03-20T15:26:34,397 INFO [2da4e66f-6092-46a7-9542-60afc0611205 HiveServer2-Handler-Pool: Thread-32([])]: ql.Driver (Driver.java:compile(429)) - Compiling command(queryId=hive_20180320152634_a6ef02a1-e018-4085-8ceb-8a8d2733b427): select * from reportingperiod limit 5
2018-03-20T15:26:37,761 INFO [HiveServer2-Background-Pool: Thread-35([])]: ql.Driver (Driver.java:execute(1735)) - Executing command(queryId=hive_20180320152634_a6ef02a1-e018-4085-8ceb-8a8d2733b427): select * from reportingperiod limit 5
我正在尝试根据这样的分隔符提取查询部分
delimiter based extract, first delimiter ': ' upto '\n'
这样我就可以得到这样的期望输出。
select * from reportingperiod limit 5
最初我尝试使用 regex 和 grep -OE 方法的查询提取。现在我正在尝试实现一个通用方法,以便捕获任何查询。
我试过这样。
IFS=$': '
for i in `cat logfile`; do echo $i;
done
上面的代码没有按预期工作,因为我不知道如何通过第二个分隔符来提取查询。任何帮助将不胜感激。
【问题讨论】:
-
您想要在最后一个
:和行尾之间的任何内容吗? IE。您是否假设所需的查询从不包含:?似乎有风险。另一方面,尝试使用正则表达式识别 SQL 语法很困难。可以更多地假设您的输入行的语法吗?例如。我们可以假设之前总会有command(queryId=hive_20180320152634_a6ef02a1-e018-4085-8ceb-8a8d2733b427):这样的东西吗? -
我相信你必须在这里更清楚一点。我看到的几个问题是:(1)每行有多个':',所以你想从第一个还是最后一个中提取? (2) 日志文件包含一个编译行和一个执行行。你想要两个每个
queryId。请为我们提供一个真实的输入示例和真实的预期输出。 -
是的,有多个 ':' 但所有查询都以 /n 结尾。所以我想像最后一个':'和换行符
-
@TejuPriya 请参阅以下答案,它将提供您的要求。
-
你没有发现问题吗?如果您的查询包含
:并且您只关注最后一个:,那么您只会得到部分查询。