在shell脚本中以列表格式从单个行字符串中提取值

时间:2017-03-10 01:50:30

标签: bash shell awk sed grep

在编写shell脚本时,如何在单个行字符串中提取特定键的所有值,这是一个元组列表?例如,我的字符串是:

[{"key1":"value1", "key2":"value2"},{"key1":"val1","key2":"val2"}]

,输出应该是包含value1val1的数组。

2 个答案:

答案 0 :(得分:1)

这比使用真正的解析器要脆弱得多,所以你很可能会发现从长远来看下载jq可能是值得的,但如果你只想使用grep,那么你就是在Ubuntu上你应该有GNU grep并且可以对你给出的字符串执行以下操作:

grep -Po 'key1":"\K[^"]+'

使用-P使用Perl样式的正则表达式,-o仅显示匹配的部分。我们在模式中添加\K,以便它之前的所有内容都不会被计为匹配的一部分。

因此,根据您的输入,我执行以下操作:

$ printf '[{"key1":"value1", "key2":"value2"},{"key1":"val1","key2":"val2"}]' | grep -Po 'key1":"\K[^"]+'
value1
val1

将此与实际了解JSON的jq进行比较:

jq '[ .[] | .["key1"] ]'

输出:

[                                                                                                
  "value1",
  "val1"
]

答案 1 :(得分:1)

根据您向我们展示的示例,基于对输入所包含内容的一系列假设,这是一种脆弱的方法:

$ awk -F'[":]+' -v k="key1" '{for (i=2;i<=NF;i+=3) if ($i==k) print $(i+1)}' file
value1
val1