簡體   English   中英

使用bash讀取json文件並從匹配的模式中grep字符串

[英]Read a json file and grep a string from matching pattern using bash

我正在嘗試使用bash解析下面的大json文件

//part of json file
{"name": "Jenkins", "version": "Jenkins-2.22"},
{"name": "FitNesse", "version": "FitNesse-2.1"},
{"name": "Quint","version": "Quint-2.12"},
{"name": "Otto","version": "Otto-1.0"},
{"name": "Gradle","version": "Gradle-1.1"}

我可以從json文件中讀取匹配“版本”的行

while read line; do
  if [[ $line =~ "version" ]] ; then
    echo $line; fi
done < $manifestfile

我想將值[Jenkins-2.22,FitNesse-2.1,Quint-2.12,Otto-1.0,Gradle-1.1]存儲在我的while循環中的數組中

在調整上面的代碼時需要幫助

假設上面的示例輸入在文件file.json的JSON 數組中,即:

[
  {"name": "Jenkins", "version": "Jenkins-2.22"},
  {"name": "FitNesse", "version": "FitNesse-2.1"},
  {"name": "Quint","version": "Quint-2.12"},
  {"name": "Otto","version": "Otto-1.0"},
  {"name": "Gradle","version": "Gradle-1.1"}
]

注意:要使以下命令在Bash 3.x中也起作用,唯一需要做的更改就是用IFS=$'\\n' read -d '' -ra versions readarray -t versions IFS=$'\\n' read -d '' -ra versions readarray -t versions替換readarray -t versions IFS=$'\\n' read -d '' -ra versions

使用Bash 4.x和jq

必須首先安裝jq ,但如果可行,這是值得的,它很值得:可以進行復雜的,健壯的JSON解析

# Extract the version numbers and read them into a Bash array.
readarray -t versions < <(jq -r '.[].version' file.json)

# Print the array.
printf '%s\n' "${versions[@]}"

以上收益:

Jenkins-2.22
FitNesse-2.1
Quint-2.12
Otto-1.0
Gradle-1.1

使用Bash 4.x和awk

如果您無法安裝jq ,則可以使用以下awk解決方案,但請注意,該解決方案的健壯性要差得多 ,它依賴於JSON的格式完全如上所述
此警告適用於任何解決方案使用標准工具( awkgrepsed ,...) - 唯一一個專門的JSON解析器將穩健運行

readarray -t versions < <(awk -F\" 'NF>1 { print $(NF-1) }' file.json)

# Print the array.
printf '%s\n' "${versions[@]}"
sed -n 's/.*"\([^"]*\)"}.*/\1/p' <file>

jq是在Unix shell中處理JSON數據的合適工具。

假設test.json文件包含:

[
{"name": "Jenkins", "version": "Jenkins-2.22"},
{"name": "FitNesse", "version": "FitNesse-2.1"},
{"name": "Quint","version": "Quint-2.12"},
{"name": "Otto","version": "Otto-1.0"},
{"name": "Gradle","version": "Gradle-1.1"}
]

test_json.sh腳本(簡化版):

#!/bin/bash
versions=$(jq '.[] | .version' test.json)
versions_arr=($versions)  # contains an array of `version` key values

我必須警告 ,如果字符串$versions包含亂碼 ,則上述方法($versions) (在字符串拆分后創建數組)可能會失敗


更“穩定”的方法是將內置的read命令與-a選項一起使用,以將字數據讀入指定數組:

test_json.sh腳本(“穩定”版本):

#!/bin/bash
versions=$(jq '.[] | .version' test.json)
read -a versions_arr <<< $versions  # read `version` key values into array

現在, versions_arrversion鍵值的數組。
要打印第二個數組值,您可以執行以下操作:

echo ${versions_arr[1]} 

輸出:

"FitNesse-2.1"

使用JQ輕松解析您的Json,只需安裝JQ,然后使用:

如果您有json數組,並且在每個元素中都有字段版本,則可以使用:

 cat myJsonFile | jq '.[].version'

這將返回版本列表

如果要逐行處理

while read line; do
  if [[ $line =~ "version" ]] ; then
    echo $line | jq .[] | jq ."version" ; fi
done < $manifestfile

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM