在shell脚本

时间:2015-09-24 18:25:38

标签: linux bash shell unix sh

我有一个下面提到的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\

我也不能在我的脚本中使用json解析器,因为它没有安装在机器

关于我的unix风味的详细信息

$ 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

1 个答案:

答案 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)