Извлечь элемент массива JSON на основе значения подсеремента

Вы можете сделать что-нибудь вроде

tar tf thefile.tar | cut -d/ -f1 | sort -u

, чтобы увидеть, какие записи верхнего уровня есть в tar; по каналу wc -l , чтобы проверить, есть ли их больше одного. Обратите внимание, что есть несколько случаев, когда это не сработает, например если tar содержит пути к файлам в форме somedir / something , а также ./ somedir / something (или что-то более безумное); Однако это должно быть необычным.

Это будет читать весь tar-файл перед выводом чего-либо из-за сортировки , хотя это должно быть быстрее, чем фактическое извлечение, потому что это всего лишь одно последовательное чтение, и оно может пропускать большие файлы.

Если вы делаете это в интерактивном режиме и файл может быть большим, вы можете изменить sort -u на uniq и Control + C , если он распечатывает более одного объекта.

2
06.03.2018, 03:31
3 ответа

Dada la variable de shell numestablecida igual a335:

grep -A1 "\"id\" : $num," /path/to/file

Saco mucho provecho de las prácticas opciones -A, -By -Cde grep, los mnemotécnicos que utilizo son "Después", "Antes" y "Contexto".

  • grep -A n 'pattern' filemostrará las n líneas A después de una coincidencia de patrón, además de la propia línea coincidente.

  • grep -C n 'pattern' filemostrará las n líneas B antes de una coincidencia de patrón, además de la propia línea coincidente.

  • grep -C n 'pattern' filemostrará las líneas n antes de y después de (i. mi. el C ontext de )una coincidencia de patrón, además de la propia línea coincidente.

1
27.01.2020, 21:51
awk '/"id" : 335/{getline;print}'

o

var="\"id\" : 335"
awk "/$var/{getline;print}"

o

awk -v var="\"id\" : 335" '$0~var{getline;print}'

o

var="\"id\" : 335"
awk -v var="$var" '$0~var{getline;print}'

o cualquiera de los anteriores, pero sin necesidad de la parte "id" : "de la cadena, en la forma:

awk -v var="335" '$0~"id" : var{getline;print}'
1
27.01.2020, 21:51

Suponiendo que el archivo JSON es una gran matriz de objetos como

  {
    "href": "http://localhost:8080/api/v1/clusters/sys41/requests/333",
    "Requests": { "id": 333, "cluster_name": "sys41", "request_status": "COMPLETED" }
  },

(observando que las líneas nuevas no son significativas, y tampoco lo es el orden de las claves en un objeto )entonces, el siguiente comando jqobtendría la entrada request_statuspara el idcorrespondiente a$num:

$ num=355
$ jq -r ".[].Requests | select(.id == $num).request_status" file.json
FAILED

Hace esto seleccionando todas las entradas Requestsde cada objeto y filtrándolas en id. Para los que pasan el filtro, extrae request_status.

La opción -ra jqhace que genere datos sin procesar en lugar de JSON(FAILEDhabría estado entre comillas dobles sin él ).


Material adicional:

$ jq -r '.[].Requests | "\(.id): \(.request_status)"' file.json
333: COMPLETED
334: FAILED
335: FAILED
336: COMPLETED
6
27.01.2020, 21:51

Теги

Похожие вопросы