苦苦挣扎

时间:2014-07-09 14:25:33

标签: string shell curl awk

我有一个curl命令,它返回给我这种json格式的文本

[{"id": "nUsrLast//device control", "name": "nUsrLast", "access": "readonly", "value": "0", "visibility": "visible", "type": "integer"}]

我想得到字段值的值。

有人可以给我一个简单的awk或grep命令吗?

3 个答案:

答案 0 :(得分:2)

您可以将grep与oP参数一起使用,

$ echo '[{"id": "nUsrLast//device control", "name": "nUsrLast", "access": "readonly", "value": "0", "visibility": "visible", "type": "integer"}]' | grep -oP '(?<=\"value\": \")[^"]*'
0

来自grep --help

  • -P, --perl-regexp PATTERN is a Perl regular expression
  • -o, --only-matching show only the part of a line matching PATTERN

模式说明:

  • (?<=\"value\": \") Lookbehind用于设置或放置匹配标记。在我们的例子中,正则表达式引擎将匹配标记放在字符串"value": "之后。
  • [^"]*现在它匹配除"之外的任何字符零次或多次。当检测到"时,正则表达式引擎会停止它的匹配操作。

答案 1 :(得分:2)

这是awk

awk -v RS="," -F\" '/value/ {print $4}' file
0

它是如何工作的?
RS设置为,会违反以下内容:

awk -v RS="," '{$1=$1}1' file
[{"id": "nUsrLast//device control"
"name": "nUsrLast"
"access": "readonly"
"value": "0"
"visibility": "visible"
"type": "integer"}]

然后/value/ {print $4}打印以4

分隔的字段"

答案 2 :(得分:0)

这个解决方案不是grep或awk,但是你的系统有很好的机会,这是迄今为止最好的解决方案:

echo <your_json> | perl -e '<STDIN> =~ /\"value\"\s*:\s*\"(([^"]|\\")*)\"/; print $1;'

它通过确保有一个尾随的"字符来处理失败请求的可能性。它还处理字符串中的反斜杠转义"符号和&#34;值&#34;之间的空格。和结肠人物。

处理多行中的JSON,但其他解决方案都没有。

\"value\"\s*:\s*\"确保我们正在处理正确的字段,然后

(([^"]|\\")*)捕获关联的有效JSON字符串

\&#34;确保字符串正确终止

坦率地说,你最好还是使用real JSON parser