我有一个curl命令,它返回给我这种json格式的文本
[{"id": "nUsrLast//device control", "name": "nUsrLast", "access": "readonly", "value": "0", "visibility": "visible", "type": "integer"}]
我想得到字段值的值。
有人可以给我一个简单的awk或grep命令吗?
答案 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。