嗨,我有一个日志文件,我正在做这样的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
上面的代码没有按预期工作,因为我不知道如何传递第二个分隔符来提取查询。任何帮助将不胜感激。
答案 0 :(得分:1)
我相信你感兴趣的是:
awk -F ':' '/select/{print $NF}' <logfile>
请注意,您从第一个:
开始写到行尾。但是,在您的示例中,每行有多个:
。
您也可以使用sed
来完成同样的事情:
sed '/select/!{d};s/.*: *//' <logfile>
答案 1 :(得分:1)
你也可以使用剪辑。
我的意见是你应该使用最简单的工具来满足你的要求,所以这可能会好一些。
首先打印所有re.compile
:
在前两个字段后打印东西。
cut -d ':' -f 2- <file>