grep与shell脚本中的分隔符

时间:2018-04-12 06:48:07

标签: bash shell awk sed grep

嗨,我有一个日志文件,我正在做这样的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

上面的代码没有按预期工作,因为我不知道如何传递第二个分隔符来提取查询。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我相信你感兴趣的是:

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

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

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

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

答案 1 :(得分:1)

你也可以使用剪辑。

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

首先打印所有re.compile

:

在前两个字段后打印东西。

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