не может вызвать переменную окружения bash внутри jq - PullRequest
0 голосов
/ 27 апреля 2019

В приведенном ниже сценарии я не могу успешно вызвать переменную repovar в команде jq.

cat quayrepo.txt | while read line
do
  export repovar="$line"
  jq -r --arg repovar "$repovar" '.data.Layer| .Features[] | "\(.Name), \(.Version), $repovar"' severity.json > volume.csv
done

Скрипт использует текстовый файл для циклического повторения имен репо

quayrepo.txt ---> файл имеет список имен, в этом случае значение файла "Reponame1"

пример входного файла severity.json:

{
  "status": "scanned",
  "data": {
    "Layer": {
      "IndexedByVersion": 3,
      "Features": [
        {
          "Name": "elfutils",
          "Version": "0.168-1",
          "Vulnerabilities": [
            {
              "NamespaceName": "debian:9",
              "Severity": "Medium",
              "Name": "CVE-2016-2779"
            }
          ]
        }
      ]
    }
  }
}

желаемый вывод:

elfutils, 0.168-1, Medium, Reponame1

Требуемый вывод: мне нужно получить значение моей переменной среды в качестве последнего столбца в моем выходном CSV-файле

Ответы [ 3 ]

3 голосов
/ 27 апреля 2019

Вам нужно заключить $ repovar в круглые скобки, так как остальные значения

repovar='qweqe'; jq -r --arg repovar "$repovar" '.data.Layer| .Features[] | "\(.Name), \(.Version), \($repovar)"' tmp.json

Результат:

elfutils, 0.168-1, qweqe

Нет необходимости в export.

1 голос
/ 27 апреля 2019

Вам вообще не нужен цикл while read в bash;jq сам может зацикливаться на ваших входных строках, даже если они не являются JSON, позволяя вам запускать jq только один раз, а не один раз для каждой строки в quayrepo.txt.

jq -rR --slurpfile inJson severity.json <quayrepo.txt >volume.csv '
($inJson[0].data.Layer | .Features[]) as $features |
[$features.Name, $features.Version, .] |
@csv
'
  • jq -R указывает необработанный ввод, позволяя jq непосредственно читать строки из quayrepo.txt в .
  • jq --slurpfile varname filename.json считывает filename.json в массив JSON-объектов, проанализированных из этого файла.Если файл содержит только один объект, для ссылки на него необходимо обратиться к $varname[0].
  • @csv преобразует массив в строку вывода CSV, корректно обрабатывая данные со встроенными кавычками или другими странностями, которые требуютспециальная обработка.
1 голос
/ 27 апреля 2019
#!/usr/bin/env bash

while read line
do
  jq -r --arg repovar "$line" '.data.Layer.Features[] | .Name + ", " + .Version + ", " + $repovar' severity.json
done < quayrepo.txt > volume.csv

с quayrepo.txt как

Reponame1

и severity.json как

{
  "status": "scanned",
  "data": {
    "Layer": {
      "IndexedByVersion": 3,
      "Features": [
        {
          "Name": "elfutils",
          "Version": "0.168-1",
          "Vulnerabilities": [
            {
              "NamespaceName": "debian:9",
              "Severity": "Medium",
              "Name": "CVE-2016-2779"
            }
          ]
        }
      ]
    }
  }
}

производит volume.csv, содержащий

elfutils, 0.168-1, Reponame1

К @точка пика, изменение > на >> в ...severity.json >> volume.csv создаст многострочный CSV вместо простой перезаписи до последней строки

...