複数のファイルからパラメータと値を取得する

複数のファイルからパラメータと値を取得する

/var/placeフォルダには、次の100〜1000個のファイルがあります。

-rw-r--r-- 1 root root   261 Dec 24 22:52 total_machines-10.json
-rw-r--r-- 1 root root   261 Dec 24 22:52 total_machines-11.json
-rw-r--r-- 1 root root   261 Dec 24 22:52 total_machines-12.json
-rw-r--r-- 1 root root   261 Dec 24 22:52 total_machines-13.json
-rw-r--r-- 1 root root   261 Dec 24 22:52 total_machines-14.json
-rw-r--r-- 1 root root   261 Dec 24 22:52 total_machines-15.json
-rw-r--r-- 1 root root   261 Dec 24 22:52 total_machines-16.json
-rw-r--r-- 1 root root   261 Dec 24 22:52 total_machines-17.json
-rw-r--r-- 1 root root   261 Dec 24 22:52 total_machines-18.json
-rw-r--r-- 1 root root   261 Dec 24 22:52 total_machines-19.json

。 。

各ファイル(total_machines_rhel-xx.json)は次のとおりです(テーマの値は異なる場合があります)。

{
  "version": 1,
  "partitions": [
    {
      "topic": "total_machines_rhel",
      "partition": 10,
      "replicas": [
        1001,
        1003,
        1004
      ],
      "log_dirs": [
        "any",
        "any",
        "any"
      ]
    }
  ]
}

テーマを印刷する方法これらすべてのファイルの名前

期待されるパフォーマンス

total_machines-10.json topic=total_machines_rhel
total_machines-11.json topic=total_machines_fedora
total_machines-12.json topic=total_machines_aix
.
.
.

答え1

jqバージョン 1.5+

jq -r '.partitions[] | "\(input_filename) topic=\(.topic)"' total_machines-*.json

PerlのJSONモジュールを使用する:

perl -MJSON -0777 -nE '
  $h = decode_json($_); say "$ARGV topic=$h->{partitions}[0]{topic}"
' total_machines-*.json

そしてミラー、現在のファイル名でインデックス付けされたストリームの外部配列を使用します。partitionsMillerは現在のJSON配列を整数キーマップに平坦化していますが、ファイルには各配列に1つの要素しかないため、この場合は厳しい制限ではありません。実際にはPerlバージョンに頼るよりも良いことはありません。中間要素はさらに悪化します[0]

mlr --ijson --onidx put -S -q '
  @value[FILENAME] = "topic=".${partitions:0:topic}; end {emit @value, "a"}
' total_machines-*.json

関連情報