Как получить значения из объекта json с помощью awk или sed [дубликат]

Способ awk:

$ awk 'NR != $1 { for (i = prev + 1; i < $1; i++) {print i} } { prev = $1 + 1 }' file
3
5
6
7
9

Более четко:

awk 'NR != $1 {
  for (i = prev + 1; i < $1; i++) {
    print i
  }
} 
{ 
  prev = $1
}'

Для каждой строки я проверяю, совпадает ли номер строки с номером, и если нет, печатаю каждое число между предыдущим (prev) и текущим (эксклюзивным, поэтому i = prev + 1).

4
18.11.2018, 11:56
5 ответов

В соответствии с вашим мнением об основных командах, если структура вашего файла точно такая, как показано, grepможет вам помочь:

$ grep -B2 -A3 '"name" : "Admin_UserGroup"' File

но если все в одну строку:

$ sed -E 's/\},\s*\{/\},\n\{/g' File | grep  '"name" : "Admin_UserGroup"'

Используя исходный пример, вы бы использовали мое решение следующим образом:

$ echo "$Group_ID" | grep...
8
27.01.2020, 20:44

Использованиеjq:

$ printf '%s\n' "$Group_ID" | jq '.[] | select(.name == "Admin_UserGroup")'
{
  "id": "89f3bd6a-33a9-4e02-9fe3-eae660c5a6cf",
  "name": "Admin_UserGroup",
  "path": "/Admin_UserGroup",
  "subGroups": []
}

Это выбирает все объекты в массиве, чей ключ nameсоответствует значению Admin_UserGroup.

14
27.01.2020, 20:44

Вы можете использовать JSON.awk:

awk -f JSON.awk -v file1.json file2.json

https://github.com/step-/JSON.awk

6
27.01.2020, 20:44

В последних версиях ksh93вы можете анализировать данные json в составную переменную ksh93 с помощьюread -m json:

print -r -- "$Group_ID" | IFS= read -rm json v
for ((i = 0; i < ${#v[@]}; i++)); do
  if [[ ${v[i].name} = Admin_UserGroup ]]; then
    print -r -- "${v[i]}"
  fi
done

Выводит:

(
        id=89f3bd6a-33a9-4e02-9fe3-eae660c5a6cf
        name=Admin_UserGroup
        path=/Admin_UserGroup
        typeset -C subGroups
)

Вместо print -r -- "${v[i]}"вы можете вывести ${v[i].path}или любую другую информацию из этой составной переменной.

2
27.01.2020, 20:44
$ awk '{if($0~/"AdminUserGroup"/) {NR=NR-1;print $0; NR=NR+2;print $0; } }'file1

Таким образом мы можем вывести информацию о строках рядом с искомой строкой. Также я думаю, что вместо того, чтобы печатать его, мы можем также поместить все это в массив:

$ awk '{if($0~/"AdminUserGroup"/) {NR=NR-1;arr[$i]=(print $0);i=$((i+1)); \
    NR=NR+2; arr[$i]=(print $0); } }'file1.

Затем мы можем использовать детали массива.

0
27.01.2020, 20:44

Теги

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