cidrリストを含むファイルがあります。 Bashスクリプトを使用して次の形式で大きなjsonを作成する方法 単一のCIDRを保持
[{"source":"1.1.1.0/32","protocol":"17","isStateless":true,"udpOptions":{"destinationPortRange":{"max":65535,"min":1},"sourcePortRange":{"min":521,"max":65535}}}]
CIDRが複数あります
[{"source":"1.1.1.0/24","protocol":"17","isStateless":true,"udpOptions":{"destinationPortRange":{"max":55555,"min":10001},"sourcePortRange":{"min":521,"max":65535}}},{"source":"2.2.2.0/24","protocol":"17","isStateless":true,"udpOptions":{"destinationPortRange":{"max":55555,"min":10001},"sourcePortRange":{"min":521,"max":65535}}},{"source":"3.3.3.0/24","protocol":"17","isStateless":true,"udpOptions":{"destinationPortRange":{"max":55555,"min":10001},"sourcePortRange":{"min":521,"max":65535}}}]
200項目にしたいです。 jsonがどのように機能するのかわかりません。誰でも私を助けることができますか? jsonをbashスクリプトの変数として使用したいと思います。
入力CIDRファイルは次のとおりです。
1.1.1.0/22
2.2.2.0/24
5.5.5.0/21
6.6.0.0/16
bashスクリプトで与えられたソリューションを試しましたが、\r
すべてのCIDRに近づきました。
スクリプト:
#!/bin/bash
lel=$(while read cidr ; do
jq -n --arg CIDR "$cidr" '[{"source":$CIDR,"protocol":"17","isStateless":true,"udpOptions": {"destinationPortRange":{"max": 65535,"min": 1},"sourcePortRange": {"min":521,"max": 65535} }}]'
done < lol)
echo $lel
ハハファイル:
1.22.0.0/15
1.38.0.0/15
1.186.0.0/15
14.96.0.0/14
出力
[ { "source": "1.22.0.0/15\r", "protocol": "17", "isStateless": true, "udpOptions": { "destinationPortRange": { "max": 65535, "min": 1 }, "sourcePortRange": { "min": 521, "max": 65535 } } } ] [ { "source": "1.38.0.0/15\r", "protocol": "17", "isStateless": true, "udpOptions": { "destinationPortRange": { "max": 65535, "min": 1 }, "sourcePortRange": { "min": 521, "max": 65535 } } } ] [ { "source": "1.186.0.0/15\r", "protocol": "17", "isStateless": true, "udpOptions": { "destinationPortRange": { "max": 65535, "min": 1 }, "sourcePortRange": { "min": 521, "max": 65535 } } } ] [ { "source": "14.96.0.0/14\r", "protocol": "17", "isStateless": true, "udpOptions": { "destinationPortRange": { "max": 65535, "min": 1 }, "sourcePortRange": { "min": 521, "max": 65535 } } } ]
ベストアンサー1
データとコードには2つの主な問題があります。
- DOSまたはWindowsのテキストファイル形式の入力ファイルがあります。
- コードは、複数の要素を含む単一の配列ではなく、複数の単一要素の配列を作成します。
入力ファイルがlol
DOS / Windows形式のテキストファイルのようです。これは、Unixテキストファイルを入力として要求するユーティリティがファイルを読み取るときに、各行の末尾\r
に追加のキャリッジリターン()があることを意味します。
ファイルをUnixテキストファイル形式に変換する必要があります。これはdos2unix
次の方法で行うことができます。
コードの場合、シェルループを避け、jq
一度にファイル全体を読み取ることができます。これにより、コードで実行するなど、それぞれが1つのオブジェクトを含む配列セットではなく、単一の結果配列を作成できます。
以下では、結果の最上位配列要素間の唯一の違いが値であると仮定しますsource
(質問には、送信元ポートと宛先ポートの最大値と最小値を選択する方法の説明はありません)。
jq -n -R '
[inputs] |
map( {
source: .,
protocol: "17",
isStateless: true,
udpOptions: {
sourcePortRange: { min: 521, max: 65535 },
destinationPortRange: { min: 1, max: 65535 }
}
} )' cidr.txt
または、あなたの質問と同じ簡潔な1行形式で書いてください。
jq -n -R '[inputs]|map({source:.,protocol:"17",isStateless:true,udpOptions:{sourcePortRange:{min:521,max:65535},destinationPortRange:{min:1,max:65535}}})' cidr.txt
inputs
、 を使用してjq
残りの入力を読み込みます。との各行を単一の文字列として-R
読み込みます。cidr.txt
これを配列に入れると、[inputs]
文字列配列が生成されます。この呼び出しはこの配列から各文字列を取得し、より大きな静的オブジェクトの値map()
に変換します。source
「コンパクト」出力を得るために-c
呼び出しに追加されました。jq
入力データをDOSからUnixテキスト形式に変換したくない場合、または変換できない場合は、式からキャリッジリターンを削除できますjq
。
これを行うには、外側の角かっこを含む.
以降source:
をに置き換えます。(.|rtrimstr("\r"))
これにより、ファイルから読み取られたすべての文字列の末尾からキャリッジリターンが削除されます。