Awk
如何用 Bash 腳本解析?(平台 MIPS)?
$ curl -LNs "http://urladrescom/content.json" > content.json
內容.json
{ "k":[ { "i":1, "n":"NAME 1", "p":[ { "b":"Event 1", "c":"00:00", "d":"03:00" }, { "b":"Event 2", "c":"23:00", "d":"00:00" } ] }, { "i":2, "n":"NAME 2", "p":[ { "b":"Event 1", "c":"07:15", "d":"09:15" }, { "b":"Event 2", "c":"22:00", "d":"23:15" }, { "b":"Event 3", "c":"23:15", "d":"02:30" } ] }, { "i":3, "n":"NAME 3", "p":[ { "b":"Event 1", "c":"07:15", "d":"09:15" }, { "b":"Event 2", "c":"22:00", "d":"23:15" }, { "b":"Event 3", "c":"23:15", "d":"02:30" } ] } ] }
我想使用 Bash 腳本(、、、等)(或 Bash 腳本 cmd 中的 Python)獲取事件 1、2、3 下的“NAME 2”中
grep
的awk
內容sed
。我想要列印結果:
NAME 2 \ Event 1 \ 07:15 \ 09:15 NAME 2 \ Event 2 \ 22:00 \ 23:15 NAME 2 \ Event 3 \ 23:15 \ 02:30
你可以使用這個 Python 來做你想做的事:
$ cat parse.py #!/bin/python import json #from pprint import pprint with open('content.json') as f: data = json.load(f) for dict in data["k"]: if (dict["n"] == "NAME 2"): for elem in dict["p"]: print(dict["n"] + ' \\ ' + elem["b"] + ' \\ ' + elem["c"] + ' \\ ' + elem["d"])
例子
$ ./parse.py NAME 2 \ Event 1 \ 07:15 \ 09:15 NAME 2 \ Event 2 \ 22:00 \ 23:15 NAME 2 \ Event 3 \ 23:15 \ 02:30
使用命令行 JSON 解析器
jq
…可能有一個更短的
jq
表達式可以做到這一點,但這就是我想出的:$ jq -r --arg name "NAME 2" '.[][]|select(.n==$name).p[]|[$name,.[]]|join(" \\ ")' content.json NAME 2 \ Event 1 \ 07:15 \ 09:15 NAME 2 \ Event 2 \ 22:00 \ 23:15 NAME 2 \ Event 3 \ 23:15 \ 02:30
或者,按照 steeldriver 的建議,使用選擇性更高的程式碼,
$ jq -r --arg name "NAME 2" '.k[]|select(.n==$name).p[]|[$name, .b, .c, .d]|join(" \\ ")' content.json NAME 2 \ Event 1 \ 07:15 \ 09:15 NAME 2 \ Event 2 \ 22:00 \ 23:15 NAME 2 \ Event 3 \ 23:15 \ 02:30
name
是一個jq
變數,其值在命令行上傳遞。jq
程式碼做了五件事:
- 提取
k
我們感興趣的數據中的數組。- 選擇我們要輸出的特定數組(以及其中的
p
位)。- 創建一個用於輸出的數組(由於名稱不是數據的一部分,因此必須插入它)。
- 使用插入的特定分隔符進行輸出。