非常に長いJSONデータ行を含むテキストファイルがあり、特定のフィールドの値を抽出する必要があります。最も簡単な方法はjq
orを使用することですgrep -o
。ただし、会社のコンピュータにあるためインストールできず、jq
私たちが使用しているSolarisバージョンにはgrep
そのオプションはありません-o
。現在、次のコマンドを使用しています。
cat json.file |
tr "," "\n" |
awk '/customfield_10701/ { print $0 }' |
tr '"' "\n" |
awk 'NR==4'
上記の方法はうまく機能しますが、複雑すぎてエレガントな解決策が必要であるという感じを消すことはできません。
例json.file
:
... jshdgfjhsdgfjh,"customfield_10701":"Some Branch","customfield_10702ksghdkfsdkfjkj ...
現在のコマンドで次のようになります。
Some Branch
(それが私が欲しいものです)。
答え1
探しているデータに文字がないことを確認し、"
ファイルに "customfield_10701"エントリを含む行が1つしかない場合
sed -n 's/.*"customfield_10701":"\([^"]*\)".*/\1/p'
例えば、
$ cat x
... jshdgfjhsdgfjh,"customfield_10701":"Some Branch","customfield_10702ksghdkfsdkfjkj ...
$ sed -n 's/.*"customfield_10701":"\([^"]*\)".*/\1/p' x
Some Branch
答え2
カンマを改行文字に変換するために使用する必要はありませんtr
。それから戻ってきました。awk
入力レコード区切り記号()としてカンマを使用できますRS
。
awk -F':' -v RS=',' '/customfield_10701/ { gsub(/"/,"",$2); print $2 }' json.file
gsub()
"
フィールド2から二重引用符(存在する場合)を削除するために使用されます。
gsub()
必要に応じて、次を使用して先行スペースと末尾のスペースとタブを削除することもできます。
awk -F':' -v RS=',' '/customfield_10701/ {
gsub(/"|^[[:blank:]]+|[[:blank:]]+$/,"",$2);
print $2
}' json.file
RSが変更された場合、出力レコード区切り文字(ORS
)は自動的には変更されず、設定しない限り(たとえばを使用して-v ORS=','
)デフォルト値(改行)のままになります。
答え3
次のテストは私にとって効果的でした。bash 3内蔵正規表現エンジン外部プログラムも必要ありません。
json='"jshdgfjhsdgfjh,"customfield_10701":"Some Branch","customfield_10702ksghdkfsdkfjkj"'
regex_hint=customfield_10701
[[ $json =~ $regex_hint\":\"(.+)\", ]] && printf '%s\n' "${BASH_REMATCH[1]}"
印刷:一部支店
「()」の間の正規表現は「グループ1キャプチャ」であり、「$ {BASH_REMATCH」に格納されます。1} "
Bashにはサポート機能が組み込まれています。POSIX拡張正規表現よく知られているよりもPerl互換正規表現