我有一个下面提到的Json文件。我需要使用输入参数解析此文件,我将传递给我的shell脚本。所以基本上我需要从下面的JSON文件中解析“collection”中的值。所以,如果我将Janan作为输入参数传递,那么我需要Janan_2作为输出,或者如果我传递Janan_ex1然后我需要Janan_loc_data作为输出
输入:abc.txt
{"znode":{
"path":"/aliases.json","prop":{
"ver":23,
"aver":10,
"count":0,
"time":"Sat Mar 07 04:39:53 GMT 2015 (1425703193598)",
"cver":0,
"czxid":123,
"Owner":0,
"mtime":"Tue Sep 22 05:59:16 GMT 2015 (1442901556990)",
"mzxid":123,
"pzxid":463856470714,
"dataLength":272},
"data":"{\"collection\":{\n \"Janan\":\"Janan_2\",\n \"Janan_ex1\":\"Janan_loc_data\",\n \"Neha\":\"Neha_1\",\n \"cric\":\"cric_2\",\n \"San\":\"San_1\",\n \"Arp\":\"Arp_1\",\n \"Nipun_test4\":\"Nipun_test3\",\n \"tran_Nipun\":\"tran_Nipun_2\",\n \"Zing\":\"Zing_1\"}}"},"tree":[{"data":{
"title":"/aliases.json","attr":{
"href":"zookeeper?detail=true&path=%2Faliases.json"}}}]}
所以实际问题是当我在shell中使用我的命令时,我无法获取值,并且在命令行中运行时,相同的命令工作正常。
在命令行运行时,下面的命令工作正常
cat abc.txt | awk -v RS=',?\\\\n[[:space:]]+' 'gsub(/\\"/,"")' | cut -d"{" -f3,3 | cut -d"}" -f1,1 | grep Janan_ex1 | cut -d":" -f2,2
上面的输出是:Janan_loc_data
但是当我在我的shell脚本中使用它时,使用以下参数
INPUT=Janan_ex1
alias_1="user/arpan/abc.txt"
alias_2=`cat $alias_1 | awk -v RS=',?\\\\n[[:space:]]+' 'gsub(/\\"/,"")' | cut -d"{" -f3,3 | cut -d"}" -f1,1 | grep $INPUT | cut -d":" -f2,2`
输出: -
\atm_2\,\n \atm_ex1\
这是因为它无法读取shell脚本中的特殊字符\
对于在脚本内部使用时的以下命令,
alias_2=`cat $alias_1 | awk -v RS=',?\\\\n[[:space:]]+' 'gsub(/\\"/,"")' | cut -d"{" -f3,3 | cut -d"}" -f1,1 | grep $INPUT`
我的输出低于输出: -
\n \Janan\:\Janan_2\,\n \Janan_ex1\:\Janan_loc_data\,\n \dps\:\dps_1\,\n \ammf\:\ammf_2\,\n \mob_search\:\mob_search_1\,\n \dnb\:\dnb_1\,\n \stamping_test4\:\stamping_test3\,\n \tran_stamping\:\tran_stamping_2\,\n \mrch_generic\:\mrch_generic_1\
$ uname -a
Linux 2.6.32-573.3.1.el6.x86_64 #1 SMP Mon Aug 10 09:44:54 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux
答案 0 :(得分:1)
我强烈建议您安装JSON解析器;这是工作的正确工具。以下是使用jq
解决问题的方法:
$ jq '.znode.data | fromjson | .collection.Janon' abc.txt
"Janan_2"
$ jq '.znode.data | fromjson | .collection.Janon_ex1' abc.txt
"Janan_loc_data"
通常,您可以使用--arg
选项:
$ jq --arg field Janan '.znode.data | fromjson | .collection | .[$field]' abc.txt
"Janan_2"
目前,请尝试使用$(...)
代替反引号;他们以不同的方式对反斜杠稍微处理。使用您的代码,我得到\Janan_loc_data\
的输出,但是通过以下内容,我得到了Janan_loc_data
。
alias_2=$(awk -v RS=',?\\\\n[[:space:]]+' 'gsub(/\\"/,"")' "$alias_1" |
cut -d"{" -f3,3 | cut -d"}" -f1,1 | grep "$INPUT" | cut -d":" -f2,2)