【问题标题】:grep with delimiters in shell script在 shell 脚本中带分隔符的 grep
【发布时间】: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 请参阅以下答案,它将提供您的要求。
  • 你没有发现问题吗?如果您的查询包含 : 并且您只关注最后一个 : ,那么您只会得到部分查询。

标签: bash shell awk sed grep


【解决方案1】:

相信你感兴趣的是:

awk -F ':' '/select/{print $NF}' <logfile>

请注意,您从第一个: 写到行尾。但是,在您的示例中,每行有多个 :

你也可以使用sed 来完成同样的事情:

sed '/select/!{d};s/.*: *//' <logfile>

【讨论】:

  • 您好,我尝试了 awk 和 sed。 awk 按预期为我工作。但 sed 对我不起作用。非常感谢您的解决方案。 awk 方法就像魅力一样!
  • @TejuPriya 我修复了sed,出现了一个小问题。
  • 确定让我试试 sed
  • sed 正则表达式缺少点
  • @mjz19910 请详细说明
【解决方案2】:

你也可以使用 cut。

我的意见是你应该使用最简单的工具来满足你的要求,所以这可能会好一点。

打印所有,在第一个:之后

cut -d ':' -f 2- <file>

在前 2 个字段之后打印内容。

echo xxx:yyy:zzz | cut -d ':' -f -2 --complement

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    相关资源
    最近更新 更多