如何在shell中捕获一个以上的列值

时间:2018-01-23 06:11:05

标签: bash shell awk grep

我是shell脚本的新手。我有这样的数据。

2018-01-18T16:23:25,389 INFO  [HiveServer2-Background-Pool: Thread-63([])]: 
ql.Driver (Driver.java:execute(1735)) - Executing 
command(queryId=hive_20180118162325_5ad8be3f-80e7-468d-bb47-1bdc2d2fb624): 
select * from aa limit 5
2018-01-18T16:23:25,393 INFO  [HiveServer2-Background-Pool: Thread-63([])]: 
ql.Driver (Driver.java:execute(2050)) - Completed executing 
command(queryId=hive_20180118162325_5ad8be3f-80e7-468d-bb47-1bdc2d2fb624); 
Time taken: 0.004 seconds

我需要从上面的数据中过滤查询并执行时间戳。 我试图过滤这样的查询。

awk 'BEGIN{ print "Query" }
 /Executing command\(queryId/{ sub(/.*queryId=[^[:space:]]+: /,""); q=$0 }
 /s3:\/\//{ print q }' OFS=',' hive-server2.log

它完全按照这样过滤了查询。

select * from aa limit 5
select * from aa limit 5

但我需要使用此查询过滤时间戳。

预期产出

Query,Executed Time
select * from aa limit 5,2018-01-18T16:23:25
select * from aa limit 5,2018-01-18T16:23:25

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

基于您的样本基于awk显示的输入可能会对您有所帮助。由于我的awk是旧版本,因此我使用了--re-interval如果您有最新版本的版本,则可以将其从代码中删除,然后给它一个镜头。

awk  -F',' '/^2018/{val=$1;next} /^select/{print $0","val;val=""}'  Input_file

编辑: 此外,我已经在GNU Awk 4.1.3进行了以下测试,以下工作正在进行。

awk -F',' '/^[0-9]{4}-[0-9]{2}-[0-9]{2}/{val=$1;next} /^select/{print $0","val;val=""}'   Input_file

输出如下。

select * from pfeevent limit 5,2018-01-18T16:23:25