gpt4 book ai didi

linux - 在 shell 脚本中执行 shell 命令时出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 10:46:50 25 4
gpt4 key购买 nike

我有一个下面提到的 Json 文件。我需要使用我将传递给我的 shell 脚本的输入参数来解析此文件。所以基本上我需要从下面的 JSON 文件中解析“集合”中的值。因此,如果我将 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

最佳答案

我强烈建议你安装一个 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)

关于linux - 在 shell 脚本中执行 shell 命令时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32768384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com