如何使用Unix命令行工具来过滤json记录中的字段?

时间:2014-03-13 16:12:48

标签: json unix command-line grep

我有一个包含许多json记录的文本文件,其格式与以下类似:

{"foo":"1","bar":"2","baz":"1","fu":"1"}
{"foo":"3","bar":"2","baz":"4","fu":"2","barf":"1"}
{"foo":"2","bar":"4","baz":"5","fu":"3"}
{"foo":"5","blerg":"1","bar":"6","baz":"6","fu":"7"}

如何使用标准的unix命令行工具来过滤掉多个不相邻的字段?

实施例。说我想只选择bar和fu,我希望我的输出看起来像:

"bar":"2" "fu":"1"

......或者其他类似的东西。谢谢!

4 个答案:

答案 0 :(得分:2)

使用sed,您可以执行此操作:

$ sed -r 's/.*("bar":"\w*").*("fu":"\w*").*/\1 \2/' file
"bar":"2" "fu":"1"
"bar":"2" "fu":"2"
"bar":"4" "fu":"3"
"bar":"6" "fu":"7"

如您所见,.*("bar":"\w*").*("fu":"\w*").*抓住了"bar": "value""fu": "value"的块,并使用\1\2将其打印回来。

答案 1 :(得分:2)

awk

这是一项简单的工作
awk -F"[{},]" '{print $3,$5}' file
"bar":"2" "fu":"1"
"bar":"2" "fu":"2"
"bar":"4" "fu":"3"
"bar":"6" "fu":"7"

支持随机字段的awk

awk -F, '{gsub(/[{}]/,x);for (i=1;i<=NF;i++) if ($i~/"foo"|"bar"/) printf "%s ",$i;print ""}' file
"foo":"1" "bar":"2"
"foo":"3" "bar":"2"
"foo":"2" "bar":"4"
"foo":"5" "bar":"6"

答案 2 :(得分:1)

如果json格式已修复,您可以使用sedcut过滤掉特定列。例如,如果要过滤掉第2列和第4列,可以运行:

$ cat output.txt | sed s/[{}]//g | cut -d, -f2,4 | sed s/,/" "/g

如果您想要更灵活,可以使用 正确的 正则表达式运行`sed或编写python脚本,这将非常简单。

更新:感谢您指出潜在的性能问题。无论如何,我投票支持awk解决方案。

$ sed s/[{}]//g output.txt | cut -d, -f2,4 | sed s/,/" "/g

答案 3 :(得分:1)

Fur未来,我认为像json命令行工具这样的json特定解析器将是最干净的解决方案。自述页面的底部还有一些对替代品的引用