利用sort 、grep、awk 处理json串的排序与搜索

假设有成千上万行这样的json串日志,如何按照某个字段排序?

2017-01-01 00:00:26,969 [http-nio-8082-exec-2] INFO (SearchActionHandler.java:190) search() – {“took”:14,”searchProduct”:”unknown”,”error_msg”:”success”,”method”:”POST”,”totalhits”:0,”length”:214,”querystring”:””,”totalshards”:6,”failedshards”:0,”goods_ids”:””,”body”:{“size”:20,”query”:{“filtered”:{“filter”:{“bool”:{“must”:[{“term”:{“kdt_id”:”18550231″}},{“bool”:{“should”:[{“term”:{“is_member”:1}},{“not”:{“term”:{“points”:0}}},{“not”:{“term”:{“trade_count”:0}}},{“exists”:{“field”:”card_id”}},{“not”:{“term”:{“register_mobile”:””}}},{“range”:{“nickname”:{“from”:””}}}]}}]}}}},”from”:0,”sort”:[{“_score”:{“order”:”desc”}},{“created_at”:{“order”:”desc”}}]},”type”:”search”,”version”:”1.0.0″,”successfulshards”:6,”hitcache”:false,”host”:”xxx”,”action”:”/customer/data/_search”,”error_code”:0,”timepoint”:1483200026}

场景是这样的,数据组给了我们一堆的ES查询日志记录,不过这个记录不是ES原生的,是我们的包了一层proxy的记录,其中took字段是响应时间,我需要拿它排序和找出响应时间在5秒以上的,took是以毫秒为单位。

这篇文章只是记录下利用sort 、grep、awk 处理json串的排序与搜索,
大于5秒的响应时间shell示例:其中query_1 是日志文件名

1
  cat query_1 | grep ""took":5[0-9]\{3\}"

带秒数排序 :

1
cat query_1 | awk -F ':|,' '{print $6 " " $0}' | sort -t " " -k 1 -n > sort_1

awk可以指定多个分隔符 ,分隔符用竖线链接,只要遇到指定的任何一个符合都会被分割成一个列 ,上行示例指定用冒号与逗号,以第一行日志为示例,按照规则就会变成这样的块:

1
2
3
4
5
6
块1:2017-01-01 00
块2: 00
块3: 26
块4:[http-nio-8082-exec-2] INFO (SearchActionHandler.java:190) search() - {"took"
块5:190) search() - {"took"
块6: 14

那块6就是我要的值,所以print$6 ,但是这个时候 只有这个值也不行,我还要看原本的json语句,$0代表原本的文本,所以加上$0 以空格分割,sort -t指定空格分割,-k指定第一列排序,就完成预想的需求了。

不带秒数的排序 :

1
sort -t : -k 5 -n ./query_3 > sort3 

1 thought on “利用sort 、grep、awk 处理json串的排序与搜索”

发表评论

电子邮件地址不会被公开。 必填项已用*标注